我已经简化了问题的模型,但本质上我正在尝试使用以下模型执行查询:
class mod1(models.Model):
mod1_id = CharField(unique=True, ...)
class mod2(models.Model):
field2 = models.ManyToManyField(mod1)
所以任何 mod2 对象都可以有 x 个 mod1...在这种情况下,我有一个 mod2 对象,它有四个 mod1 对象用“foo”、“bar”、“fizz”和“bang”的 mod1_ids 附加到它。如果我有两个不同的 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
当我单独执行这些查询时,它们都有效,但一起执行时却无效。有人可以帮我吗?谢谢。
请您参考如下方法:
你的查询使:
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"] 是互斥的。没有公共(public)部分。 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))
