【问题标题】:django order by count of many to many objectdjango按多对多对象的数量排序
【发布时间】:2015-03-31 00:08:52
【问题描述】:

我有一个模型:

class Category(models.Model):
    questions = models.ManyToManyField('Question', related_name="cat_question", blank=True)
    cat_name = models.CharField(max_length=50)
    cat_description = models.CharField(max_length=255)

    def __unicode__(self):
        return self.cat_name

在我看来,我有:

top_categories = Category.objects.all()[:7].

我将它作为模板中的上下文传递。 我想按其中的问题数量对顶级类别进行排序,例如如果 A 类别的问题最多,那么它应该排在最前面,如果 B 的问题最多,那么 B。然后第二多,依此类推..

点赞top_categories = Category.objects.all().order_by(Count(question)

有什么帮助吗?

【问题讨论】:

    标签: python django django-queryset


    【解决方案1】:

    用问题数量注释Category对象,然后按此数字降序排列:

    from django.db.models import Count
    
    top_categories = Category.objects.annotate(q_count=Count('questions')) \
                                     .order_by('-q_count')[:7]
    

    您可以查看文档order-by 中的示例,更多示例为aggreagate cheat-sheet

    【讨论】:

    • 你不能只做order_by("-questions")吗??
    【解决方案2】:

    在这种情况下,他们都按照他们在该字段中的问题数量的顺序对类别进行排序。

    但是,您会意识到.annotate() 方法还有很多其他用途。例如,您可能希望按照问题的数量和日期的降序对类别进行排序。

    您可以这样轻松实现:

    below_50 = Count('questions', filter=Q(marks__gte=50))
    top_categories = Category.objects.annotate(below_50=below_50).order_by('-date')
    

    在您的情况下,可以单独使用order_by,但更复杂的求和问题数量的查询可能需要.annotate()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-05
      • 2020-04-27
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多