【问题标题】:Multiple ManyToMany 'in' query with Django使用 Django 进行多个 ManyToMany 'in' 查询
【发布时间】:2016-03-01 16:58:59
【问题描述】:

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

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

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

所以任何 mod2 对象都可以有 x 个 mod1s...在这种情况下,我有一个 mod2 对象,它附加了四个 mod1 对象,并带有“foo”、“bar”的 mod1_ids ”、“嘶嘶”和“砰”。如果我有两个不同的 mod1_id 列表,我可以制作列表的单独 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

当我单独执行这些查询时,它们都可以工作,但它们不能一起工作。有人可以帮我吗?谢谢。

【问题讨论】:

  • 这个问题在similar question 中得到了回答。最大的区别只是包含条件Q(...__in=[...]) 而不是相等Q(...=...)

标签: python django django-q


【解决方案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))

【讨论】:

  • 谢谢,这是有道理的,但仍然不是我想要的。我想查询它是否只有它们两个,而不是一个或另一个。
  • 请原谅迟到的评论。问题是针对有一个男孩和一个女孩或多个儿子和女儿的家庭的查询集。即使男孩和女孩是排他性的,这也是一个正确的问题。 :-) 我在another question 中写了一个答案,因为如果条件没有分离到子查询,这种类型的条件会生成一个包含大量搜索笛卡尔积集的多重连接。
【解决方案2】:

您的查询将生成满足的新 Q 对象

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多