Filter tree with django-treenode

I am using django-treenode to structur certain data. That’s my model:

class Topic(TreeNodeModel):

    treenode_display_field = "name"

    name = models.CharField(
        max_length=50,
    )

Let’s assume, my tree looks like this (id in parenthesis):

'Topic 1' (1)
    'Topic 1.1' (2)
    'Topic 1.2' (3)
'Topic 2' (4)
    'Topic 2.1' (5)
        'Topic 2.1.1' (6)
    'Topic 2.2' (7)
'Topic 3' (8)
    'Topic 3.1' (9)
    'Topic 3.2' (10)
 …

My goal is to cut out 'Topic 2' (4) and its descendants. I can filter for tn_ancestors_pks, but that’s a string (!) containing the pks, comma separated. So

Topic.objects.exclude(tn_ancestors_pks__contains="4")

excludes also other pks like “14”, “42” and so on.

How can I filter for single ancestors?

If you’re saying that tn_ancestors_pks would have something like “4,5,6”, and you want to filter out the top-level topics, I’d think you could filter using startswith. e.g. tn_ancestors_pks__startswith="4,".

If it’s not the topmost-level you want to filter, then you could use tn_ancestors_pks__contains=",4,".

Side note: I know you’re probably too far along for this, but I generally recommend treebeard for managing hierarchical data within a database. It provides implementations of three of the basic mechanisms for efficiently storing hierarchies in relational databases, allowing you to optimize for your use-case. (We mostly rely upon the Materialized Path.)

Thank you, Ken, it works great with startswith and the comma.

With that, django-treenode is good enough for now, but I will keep treebeard in mind for future work.