Django 按多对多对象的计数排序



我有一个模型:

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)

有什么帮助吗?

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

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

您可以查看文档排序中的示例,更多汇总备忘单示例

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

但是,您将.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()

最新更新