How do I query objects of all children of a node with Django mptt?

Rivadiz picture Rivadiz · Oct 26, 2015 · Viewed 9k times · Source

I am trying to get the objects of all the children of a given node on Django with django-mppt

I have a model designed as shown below, the classes/categories (node) with the same indent level defines siblings, inner indents are children. The objects tagged with a category are shown just below the category (node). The objects start with a - symbol. The numbers along the classes/categories (nodes) are the ids.

all the nodes are the instances of Category class with the id given.

high school (1)
    class 8 (2)
        division a (3)
            -Billie
            -Tre
            -Mike

        division b (4)
            -Patrik
            -Pete
            -Andy
    class 9 (3)
        division a (8)
            -Mark
            -Tom
            -Travis

        division b (5)
            -Gerard
            -Frank
            -Mikey

    class 10  (4)
        division a (6)
            -Hayley
            -Jeremy
            -Taylor

        division b (7)
            -Steven
            -Slash
            -Izzy

I can get the query sets of a specific node this way,

>>> Category.objects.get(pk=7).product_set.all()
[Steven, Slash, Izzy]


>>> Category.objects.get(pk=4).product_set.all()
[Mark, Tom, Travis]

How do I query with pk=1, pk=2, pk=3 or pk=4 to get all the child objects?

example,

the query for pk=2 query must return

[Billie, Tre, Mike, Patrik, Pete, Andy]

Answer

Tebe Tensing picture Tebe Tensing · Nov 3, 2015
Category.objects.get(pk=2).get_descendants(include_self=True)

This will get you all category descendants including self.

Assuming that your Product model has a Foreign key category, you can use:

Product.objects.filter(category__in=Category.objects.get(pk=2)\
    .get_descendants(include_self=True))