Фильтрация QuerySet по __count of RelatedManager

У меня есть QuerySet, который я хотел бы отфильтровать по количеству related_name, В настоящее время у меня есть что-то вроде этого:

objResults = myObjects.filter(Q(links_by_source__status=ACCEPTED),Q(links_by_source__count=1))

Однако, когда я запускаю это, я получаю следующее сообщение об ошибке:

Cannot resolve keyword 'count' into field

Я предполагаю, что этот запрос работает индивидуально на каждом из links_by_source связи, поэтому нет count функция, так как это не QuerySet, с которым я работаю. Есть ли способ фильтрации, чтобы для каждого возвращаемого объекта links_by_source точно 1?

1 ответ

Решение

Вам нужно использовать функцию агрегирования, чтобы получить счетчик, прежде чем вы сможете фильтровать его.

from django.db.models import Count
myObjects.filter(
  links_by_source__status=ACCEPTED).annotate(link_count=Count('links_by_source')
).filter(link_count=1)

Обратите внимание, что вам следует обратить внимание на порядок аннотирования и фильтрации здесь: этот запрос подсчитывает количество ПРИНЯТЫХ ссылок, не уверен, хотите ли вы этого или хотите проверить, что общее количество всех ссылок равно 1.

Другие вопросы по тегам