Как отфильтровать записи перед выполнением аннотации к этим записям в моделях Django? - PullRequest
0 голосов
/ 08 апреля 2011

В документации есть пример:

Book.objects.annotate(num_authors=Count('authors')).filter(num_authors__gt=1)

Как я могу отфильтровать авторов перед выполнением аннотации на авторов? Например, я хочу, чтобы считать только тех авторов, которые имеют имя "Джон".

1 Ответ

0 голосов
/ 11 апреля 2011

Я не верю, что вы можете сделать этот выборочный подсчет с помощью API абстракции базы данных Django без включения некоторого SQL. Вы вносите дополнения в SQL QuerySet, используя метод extra .

Предполагая, что пример в документации является частью приложения под названием "инвентарь" и использует синтаксис, который работает с postgresql (вы не указали, и это то, с чем я больше знаком), следующее должно делать то, что вы просить:

Book.objects.extra(
  select={"john_count":
    """SELECT COUNT(*) from "inventory_book_authors" 
    INNER JOIN "inventory_author" ON ("inventory_book_authors"."author_id"="inventory_author"."id")
    WHERE "inventory_author"."name"=%s
    AND "inventory_book_authors"."book_id"="inventory_book"."id"
    """},
  select_params=('John',)
  )
...