Q对象和'&' django的运营商

时间:2010-12-24 00:43:12

标签: django django-q

我有一个奇怪的问题。

我有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()

这给了我没有文章。 由于文章包含两个标签,它应该返回它们不应该吗?

2 个答案:

答案 0 :(得分:1)

如果查看它生成的SQL,您会看到它检查相同的标记是否同时具有这两个名称。您需要的是遍历关系的IN queryEXISTS查询。

答案 1 :(得分:0)

** 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))