Python 多对多对象计数的django顺序

Python 多对多对象计数的django顺序,python,django,django-queryset,Python,Django,Django Queryset,我有一个模型: 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

我有一个模型:

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].
我将其作为模板中的上下文传递。 我想按照问题的数量对排名靠前的类别进行排序,比如如果一个类别有最多的问题,那么它应该排在第一位,如果B有最多的问题,那么B。然后排在第二位,依此类推

比如
top\u categories=Category.objects.all().order\u by(计数(问题)


有什么帮助吗?

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

from django.db.models import Count

top_categories = Category.objects.annotate(q_count=Count('questions')) \
                                 .order_by('-q_count')[:7]

你可以看看文档中的例子,更多关于aggreagate的例子在这种情况下,他们都做同样的事情,按照他们在该领域的问题数量的顺序对类别进行排序

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

你很容易做到这一点,就像这样:

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

在您的情况下,单独使用
order\u by
是可以的,但是一个更复杂的问题总数查询可能需要
.annotate()

难道您不能只使用
order\u by(“-questions”)
??