我已经简化了问题的模型,但基本上我尝试使用以下模型执行查询:
class mod1(models.Model):
mod1_id = CharField(unique=True, ...)
class mod2(models.Model):
field2 = models.ManyToManyField(mod1)
所以任何mod2
对象都可以包含x个mod1 ...在这种情况下,我有一个mod2
对象,其上附加了mod1
个mod1_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
当我单独执行这些查询时,它们都可以正常工作,但它们并没有共同发挥作用。有人可以帮帮我吗?谢谢。
答案 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对象只有一个不满足此条件的对象。