Аннотировать с помощью отношения модели второй степени - PullRequest
1 голос
/ 02 марта 2012

У меня есть следующие (упрощенные) модели:

class School(models.Model):
    name = models.CharField(max_length=128)

class UserProfile(models.Model):
    school = models.ForeignKey(School)

class Post(models.Model):
    profile = models.ForeignKey(UserProfile)

Что я хотел бы сделать, так это получить список школ с указанием количества должностей в каждой школе. По ряду причин Post имеет внешний ключ к UserProfile вместо School. Как бы я поступил так, используя Django ORM? Я предполагаю, что мне пришлось бы использовать annotate (), но, похоже, он не работает, когда две рассматриваемые модели напрямую не связаны внешним ключом.

1 Ответ

1 голос
/ 02 марта 2012

Использование поисков, которые охватывают отношения до Создание агрегатов для каждого элемента в QuerySet :

from django.db.models import Count

School.objects.annotate(post_count=Count('userprofile__post'))

Будет использоваться такой sql:

SELECT "testapp_school"."id", "testapp_school"."name", COUNT("testapp_post"."id") AS "post_count" FROM "testapp_school" LEFT OUTER JOIN "testapp_userprofile" ON ("testapp_school"."id" = "testapp_userprofile"."school_id") LEFT OUTER JOIN "testapp_post" ON ("testapp_userprofile"."id" = "testapp_post"."profile_id") GROUP BY "testapp_school"."id", "testapp_school"."name", "testapp_school"."id", "testapp_school"."name" LIMIT 21;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...