我有一个模型:
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()