2010-03-16 63 views
2

我有以下Django模型:Django的查詢集順序通過反向ForeignKey的數量相匹配

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) 

我希望返回其有一個包含了包含在eg_idBar對象的反向關係Foo對象的列表值的列表。所以,我有:

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

如何根據其擁有的id_listeg_id值相關Bar對象的數量訂購匹配Foo對象?

回答

10

使用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') 
+0

感謝。只是最近從Django 1.0升級,所以聚合功能對我來說還是比較新的。 – msanders 2010-03-16 14:39:24

+0

作爲跟進。我試圖將過濾器作爲屬性添加到我的「Foo」模型對象中。即使我導入'Bar'模型,django shell說'計數'('bar')中的'bar'未被識別。爲什麼它在我的view.py中工作,但不在我的model.py中?謝謝! – prostock 2010-10-15 18:47:48

1

你可以通過使用aggregation,多especifically 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')