【问题标题】:Django-MPTT - ordering root nodes by count of immediate descendantsDjango-MPTT - 按直接后代的数量对根节点进行排序
【发布时间】:2011-06-29 18:55:20
【问题描述】:

我正在使用 Django-MPTT 来显示一个简单的 2 级层次结构(root => child(ren))。我正在寻找一种方法来构造我的查询集,以便节点首先返回具有最多子节点的根节点,最后返回具有最少子节点(如果有的话)的节点。

【问题讨论】:

    标签: django-queryset django-mptt


    【解决方案1】:

    查看您的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')

    【讨论】:

    • 还值得注意的是,如果您的层次结构确实只有两层深,那么您可能不会从 mptt 中获得任何好处,因为简单的父字段和订单字段就足够了并且性能更高......虽然我可能是错的。
    【解决方案2】:

    应该这样做:

    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)
    

    【讨论】:

      猜你喜欢
      • 2017-09-11
      • 1970-01-01
      • 2010-10-26
      • 2011-08-09
      • 2011-05-04
      • 1970-01-01
      • 2017-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多