Добавьте Count по обратной связи Publication и отфильтруйте значение больше пяти. Точное имя связи зависит от related_name/related_query_name, поэтому его нужно сверить с моделью.
Django ORM: выборка авторов, у которых книг больше пяти
Добавьте Count по обратной связи Publication и отфильтруйте значение больше пяти. Точное имя связи зависит от related_name/related_query_name, поэтому его нужно сверить с моделью.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Нужно составить запрос в Django ORM, который вернёт всех писателей, у которых число связанных книг превышает пять. В качестве источника данных использовать модели Writer и Publication, где Writer имеет поля id и name, а Publication – поля id, name и writer_id (внешний ключ на Writer). Запрос оформить с помощью Django ORM.
Writer: id name
Publication: id name writer_id
Ответ
Добавьте Count по обратной связи Publication и отфильтруйте значение больше пяти. Точное имя связи зависит от related_name/related_query_name, поэтому его нужно сверить с моделью.
Если ForeignKey на Writer объявлен без related_name и других переопределений, имя для ORM-фильтра — publication:
from django.db.models import Count
writers = (
Writer.objects.annotate(publication_count=Count('publication'))
.filter(publication_count__gt=5)
)
Если задано related_name='publications', используйте Count('publications'). Не путайте имя запроса с менеджером writer.publication_set. Агрегация выполняется в SQL, поэтому не нужно обходить писателей и отдельно считать книги каждого. Дополнительные JOIN могут потребовать distinct=True.