Добавьте annotate(post_count=Count('posts', distinct=True)), затем filter(post_count__gt=10). Так подсчёт и фильтрация выполняются в БД, а в шаблон передаётся готовый QuerySet.
Получение групп, в которых более десяти постов
Добавьте annotate(post_count=Count('posts', distinct=True)), затем filter(post_count__gt=10). Так подсчёт и фильтрация выполняются в БД, а в шаблон передаётся готовый QuerySet.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В рамках Django‑проекта требуется написать функцию, возвращающую набор групп. Имеются две модели — Group и Post, связанные отношением many‑to‑many (одна группа может содержать множество постов). Необходимо отобрать только те группы, у которых количество связанных постов превышает 10. Пример шаблона функции:
def most_popular_groups(request):
# Вывести список групп (Group), у которых кол-во постов (posts) больше 10
popular_groups = ...
return render(request, "groups.html", {"groups": popular_groups})
Внутри функции следует сформировать запрос, который подсчитывает количество постов для каждой группы и отбирает группы с числом постов > 10, после чего передать полученный QuerySet в шаблон "groups.html".
Ответ
Добавьте annotate(post_count=Count('posts', distinct=True)), затем filter(post_count__gt=10). Так подсчёт и фильтрация выполняются в БД, а в шаблон передаётся готовый QuerySet.
При имени связи posts:
from django.db.models import Count
from django.shortcuts import render
def most_popular_groups(request):
groups = (
Group.objects.annotate(post_count=Count('posts', distinct=True))
.filter(post_count__gt=10)
.order_by('-post_count', 'pk')
)
return render(request, 'groups.html', {'groups': groups})
Имя posts нужно сверить с фактической моделью. distinct защищает от повторного счёта при дополнительных соединениях. Если шаблон ещё и выводит сами посты каждой группы, отдельно добавьте prefetch_related: агрегат количества не загружает связанные объекты.