Вы можете проверить, совпадает ли количество Tag
s, удовлетворяющих предикату, с общим количеством тегов:
from django.db.models import Count, Q
Post.objects.annotate(
ntags=Count('tags')
).filter(
ntags=Count('tags', <b>filter=Q(tags__name__in=['a', 'b'])</b>),
ntags__gt=0
)
Таким образом, первый фильтр проверяет, соответствует ли общее количество связанных тегов то же, что и количество тегов с именем 'a'
или 'b'
. Если число другое, значит, мы знаем, что существует тег с другим именем.
Второй фильтр проверяет, больше ли количество тегов нуля, чтобы исключить совпадения без тегов.