Django QuerySet按反向ForeignKey匹配数排序

7 投票
2 回答
7328 浏览
提问于 2025-04-15 20:29

我有以下的Django模型:

class Foo(models.Model):
    title = models.CharField(_(u'Title'), max_length=600)

class Bar(models.Model):
    foo = models.ForeignKey(Foo)
    eg_id = models.PositiveIntegerField(_(u'Example ID'), default=0)

我想要返回一个包含Foo对象的列表,这些Foo对象和Bar对象之间有反向关系,而这些Bar对象的eg_id值要在一个值的列表中。所以我有:

id_list = [7, 8, 9, 10]
qs = Foo.objects.filter(bar__eg_id__in=id_list)

我该如何根据相关的Bar对象的数量来对匹配的Foo对象进行排序,这些Bar对象的eg_id值在id_list中呢?

2 个回答

1

你可以通过使用聚合来实现这个功能,具体来说是使用注解排序

在你的例子中,可以这样写:

from django.db.models import Count

id_list = [7, 8, 9, 10]
qs = Foo.objects.filter(bar__eg_id__in=id_list)
qs = qs.annotate(count=Count("bar"))
qs = qs.order_by('-count')
23

使用Django这个框架里很棒的聚合功能

from django.db.models import Count
qs = Foo.objects.filter(
           bar__eg_id__in=id_list
      ).annotate(
           bar_count=Count('bar')
      ).order_by('bar_count')

撰写回答