Django-MPTT - упорядочение корневых узлов по количеству непосредственных потомков - PullRequest
4 голосов
/ 29 июня 2011

Я использую Django-MPTT для отображения простой двухуровневой иерархии (root => child (ren)).Я ищу способ структурировать мой набор запросов так, чтобы узлы возвращались с корневым узлом, у которого наибольшее число дочерних элементов было первым, а узлом с наименьшим числом дочерних элементов (если есть) последним.

Ответы [ 2 ]

3 голосов
/ 08 августа 2017

Взгляните на ваше поле parent и запишите по ссылке related_name. Предположим, это children. Затем сделайте следующее:

from django.db.models import Count

MyMPTTModel.objects.root_nodes().annotate(
    Count('children')).order_by('-children__count')

Если вам нужен доступ к самим дочерним экземплярам, ​​вы также можете посмотреть на выполнение qs.prefetch_related('children').

3 голосов
/ 30 марта 2012

примерно так должно это сделать:

from mptt.templatetags.mptt_tags import cache_tree_children
qs = qs.filter(level__lt=2)
root_nodes = cache_tree_children(qs)
root_nodes.sort(key=lambda node: len(node.get_children()), reverse=True)
...