Объекты Q и оператор & в django - PullRequest
11 голосов
/ 24 декабря 2010

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

У меня 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 статей без различных (), поскольку он будет собирать каждую статью 2 раза, поскольку у них есть оба тега.

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

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

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

Ответы [ 2 ]

1 голос
/ 24 декабря 2010

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

0 голосов
/ 06 мая 2016
** 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))
...