在单个相关对象上使用多个条件进行过滤[关闭]
Posted
技术标签:
【中文标题】在单个相关对象上使用多个条件进行过滤[关闭]【英文标题】:Filter with multiple conditions on a single related object [closed] 【发布时间】:2016-11-15 21:42:44 【问题描述】:编辑:这个问题是对观察到的结果的误解的结果。最初发布但不起作用的 sn-p 解决了该问题。我将把它全部留在下面,以供将来以同样方式感到困惑的任何人使用。
我有两个型号answer
和answer_set
。我需要编写一个函数来接受answer_set
查询集并添加一个过滤器。
我要应用的过滤器是:answer_set
有一个 answer
和特定的 code
和 value
。
起初我尝试了类似的方法:
q.filter(answer__code=code, answer__value=value)
但这当然行不通——这是两个独立的答案(SQL 中的两个连接),即如果有一些答案具有正确的代码,而另一个答案具有正确的值,则过滤条件为真。 我想检查是否有一个答案同时满足这两个条件。 编辑:这段代码实际上完全符合我的要求。
在 SQL 中这很容易:
...
JOIN answer
...
WHERE
...
answer.value = "some_value" AND answer.code = "some_code"
但我认为原始 SQL 是最后的手段。可以在 Django ORM 中完成吗? 编辑:是的,确实如此 - 请参阅上面的 sn-p。
【问题讨论】:
向我们展示模型以及如何构建查询。使用.filter(answer__code=code, answer__value=value)
或.filter(answer__code=code).filter(answer__value=value)
真的很重要。第二种方法应该像您描述的那样(两个内部连接),但第一种应该使用单个连接。
看来整个问题可能是基于无效的假设(正在进行检查)。
是的,实际上我在问题中发布的 sn-p 确实有效,实际上是 PEBKAC。我将在一分钟内更新问题...
我对其进行了测试,结果与您最初的要求相同。不是你编辑的。我不得不绕过第二行,就像这样answers = Answer.objects.filter(code=code, value=value)
q.filter(answer__in=answers)
【参考方案1】:
编辑:你说的不正确。 filter()
函数自动“与”它的参数。见documentation on filter
【讨论】:
【参考方案2】:您可以使用 Q 对象来处理更复杂的查询。 见django docs about Q objects
from django.db.models import Q
q.filter(
Q(answer__code=code) & Q(answer__value=value)
)
【讨论】:
以上是关于在单个相关对象上使用多个条件进行过滤[关闭]的主要内容,如果未能解决你的问题,请参考以下文章