Django QuerySet упорядочение по количеству обратных совпадений ForeignKey - PullRequest
2 голосов
/ 16 марта 2010

У меня есть следующие модели 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?

Ответы [ 2 ]

12 голосов
/ 16 марта 2010

Используйте прекрасные функции агрегирования 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')
1 голос
/ 16 марта 2010

Вы можете сделать это с помощью агрегации и, в частности, аннотаций и 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...