【发布时间】:2020-10-07 12:25:14
【问题描述】:
我的情况:
我有 django 模型 HOST 和模型 PACKAGE(带有名称和版本),在 host 模型上有 FK。现在我需要过滤所有具有 packages 的 hosts 具有某些 name 和某些 version.. 因此类似于@ 987654321@ 这一切都很好,也很简单,但是我需要对几个包重复这个操作,这样我才能得到一个主机,它在一个版本中包含每个希望的包..
我尝试了两种方法,但都失败了,首先是在 for 循环中应用上面的 filter,它很丑但很有效,我很高兴我发现这不是稳定的解决方案,而且有些我接下来应用 SOMETIMES 的查询失败.. 有时是的!正如我对自己说的那样,我不会更深入 Django ORM 魔法的那个洞,我尝试用 Q 构建查询。我最终得到了以下代码
pckgs_query = reduce(
operator.and_,
(
Q(packages__name=name, packages__version__in=versions)
for name, versions in pckgs_dict.items()
)
)
hosts = Host.objects.filter(pckgs_query)
但不幸的是,这不能正常工作,因为我检查了它生成的 SQL 查询,我确定它正在寻找具有所有这些参数的单个 PACKAGE 对象,这些参数当然不存在......有没有足够熟练的人帮帮我?真的迷路了,有点希望我的应用程序现在不在 django 中 tbh
谢谢!
【问题讨论】:
-
它不起作用,因为您限制了 same 包。所以你说那个包需要有
name'best_package'和'other_package',因此从你引入两个(不同)名称的那一刻起,这总是会失败。 -
您不觉得,您应该使用
or运算符而不是and吗? -
@sonus21 比它还包括只有其中之一的主机
-
@WillemVanOnsem 在我的真实代码中类似于 packages_set 及其相关管理器,以访问从另一端到所选模型的所有包
-
@FilipM: 完全正确,但基本上发生的情况是它与相关的
Package模型连接一次,然后您开始在相关模型上添加WHERE子句.
标签: python django orm django-queryset