Последовательное выполнение запросов, без объединения в один общий - Python

Узнай цену своей работы

Формулировка задачи:

К примеру есть такой код
Листинг программы
  1. Publisher.objects.filter(book__rating__gt=3.0).annotate(num_books=Count('book'))
Проблема в том, что джанга иногда формирует запрос, противоречащий здравой логике. Например в данном примере будет сформирован такой запрос, при выполнении которого, у каждого автора в атрибуте num_books будет не общее количество его книг, а количество его книг с рейтингом > 3.0.
Листинг программы
  1. SELECT "app_publisher"."id", "app_publisher"."name", "app_publisher"."num_awards", COUNT("app_book"."id") AS "num_books"
  2. FROM "app_publisher" LEFT OUTER JOIN "app_book" ON ( "app_publisher"."id" = "app_book"."publisher_id" )
  3. WHERE "app_book"."rating" > 3.0
  4. GROUP BY "app_publisher"."id", "app_publisher"."name", "app_publisher"."num_awards"
Этот пример взят из документации и там таких нюансов с последовательными вызовами фильтров, сортировок... полно. Может как-то можно выполнить сначала запрос
Листинг программы
  1. Publisher.objects.filter(book__rating__gt=3.0)
получить объект с результатами, а потом уже запрос
Листинг программы
  1. .annotate(num_books=Count('book'))
который будет применён именно к объекту с этим результатом? Или же как-то указать джанге, чтобы формировала один запрос, вложенный в другой:
Листинг программы
  1. SELECT ...
  2. FROM (SELECT ... FROM ... WHERE)
  3. WHERE ...
Или же только один вариант - вручную писать на SQL языке запросы?

Решение задачи: «Последовательное выполнение запросов, без объединения в один общий»

textual
Листинг программы
  1. .annotate(num_books=Count('book'))

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.143 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут