Skip to main content
 首页 » 编程设计

python之使用 Django 的多个 ManyToMany 'in' 查询

2025年05月04日42cmt

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

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