Django ORM: выборка авторов, у которых книг больше пяти

Добавьте Count по обратной связи Publication и отфильтруйте значение больше пяти. Точное имя связи зависит от related_name/related_query_name, поэтому его нужно сверить с моделью.

Короткий ответ

Что ответить на собеседовании

Добавьте 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее