多个ManyToMany' in'用Django查询

时间:2015-11-27 13:15:58

标签: python django django-q

我已经简化了问题的模型,但基本上我尝试使用以下模型执行查询:

class mod1(models.Model):
    mod1_id = CharField(unique=True, ...)

class mod2(models.Model):
    field2 = models.ManyToManyField(mod1)

所以任何mod2对象都可以包含x个mod1 ...在这种情况下,我有一个mod2对象,其上附加了mod1mod1_ids个对象{{1} " foo"," bar"," fizz"和" bang"。如果我有两个不同的mod1_ids列表,我可以为列表创建单独的Q对象来执行过滤器,以便返回我的mod2对象吗?我已经尝试过了,到目前为止它还没有产生任何结果。假设我无法将id列表组合成一个列表。我尝试了什么:

from django.db.models import Q

Q1 = Q(field2__mod1_id__in=["foo"])
Q2 = Q(field2__mod1_id__in=["bar", "fizz"]

len(mod2.objects.filter(Q1 & Q2))
>>> 0

当我单独执行这些查询时,它们都可以正常工作,但它们并没有共同发挥作用。有人可以帮帮我吗?谢谢。

2 个答案:

答案 0 :(得分:1)

您查询make:

field2__mod1_id__in=["foo"] AND field2__mod1_id__in=["bar", "fizz"]

但你需要:

field2__mod1_id__in=["foo"] OR field2__mod1_id__in=["bar", "fizz"]

如果是,请使用:

mod2.objects.filter(Q1 | Q2)

https://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects

编辑:

设置["foo"]["bar", "fizz"]是独占的。没有共同点。 AND运算符始终返回[]

解决方案:

查询您需要:

field2__mod1_id__in=["foo", "bar", "fizz"]

的Python:

mod1sets = ["foo"]
mod1sets.append("bar")
mod1sets.append("fizz")

len(mod2.objects.filter(field2__mod1_id__in=mod1sets))

答案 1 :(得分:0)

您的查询将生成满足

的新Q对象
<div class="circle"></div>

您的mod2对象只有一个不满足此条件的对象。