我有以下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)
如何根据Foo
中Bar
值eg_id
的相关id_list
个对象的数量来订购匹配的{{1}}个对象?
答案 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,更具体地annotation和order_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')