Q-объектов и оператора "&" в django

У меня есть любопытная проблема.

У меня есть 3 объекта. Все равно

class Articles(models.Model):
    owner = models.ForeignKey(Author)
    tags = models.ManyToManyField('Tag')


class Tag(models.Model):
     name = models.CharField(max_length=255)

и поэтому у меня есть 3 Статьи. Все те же теги: 'tag1' и 'tag2'

И у меня есть запросы

actionsAll = Articles.objects.filter((Q(tags__name__exact="tag1") | Q(tags__name__exact="tag2"))).distinct()

Это дает мне все мои статьи. Он будет возвращать 6 статей без отдельного(), поскольку он будет собирать каждую статью 2x, поскольку у них есть оба тега.

Однако с этим запросом:

actionsAll = Articles.objects.filter((Q(tags__name__exact="tag1") & Q(tags__name__exact="tag2"))).distinct()

Это не дает мне никаких статей. Поскольку в статьях содержатся оба тега, он должен возвращать их все, не так ли?

Ответ 1

Если вы посмотрите на SQL, который он генерирует, вы увидите, что он проверяет, имеет ли тот же тег оба имени. Вам нужен запрос IN или запрос EXISTS, который пересекает отношение.

Ответ 2

** import Q from django
from *models import SuperUser, NameUser
import operator

# we do not know the name in the superhero
super_users = SuperUser.objects.all()
q_expressions = [Q(username=user.username) for user in super_users]
# we have bind super_hero with user
name_superheroes_qs = models.NameUser.objects.filter(reduce(operator.or_, q_expressions))