Django QuerySet按反向ForeignKey匹配的数量排序

时间:2010-03-16 11:14:02

标签: python django

我有以下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个对象列表,这些对象与Bar个对象具有相反的关系,这些对象的值包含在eg_id值中。所以我有:

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

如何根据FooBareg_id的相关id_list个对象的数量来订购匹配的{{1}}个对象?

2 个答案:

答案 0 :(得分:12)

使用Django可爱的aggregation features

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')

答案 1 :(得分:1)

您可以使用aggregation,更具体地annotationorder_by来实现这一目标。

在您的示例中,它将是:

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')