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