【问题标题】:Filter with multiple conditions on a single related object [closed]在单个相关对象上使用多个条件进行过滤[关闭]
【发布时间】:2016-11-15 21:42:44
【问题描述】:

编辑:这个问题是对观察到的结果的误解的结果。最初发布但不起作用的 sn-p 解决了该问题。我将把它全部留在下面,以供将来以同样方式感到困惑的任何人使用。

我有两个型号answeranswer_set。我需要编写一个函数来接受answer_set 查询集并添加一个过滤器。

我要应用的过滤器是:answer_set 有一个 answer 和特定的 codevalue

起初我尝试了类似的方法:

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)

标签: python django django-queryset django-orm


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-16
      相关资源
      最近更新 更多