【发布时间】:2015-10-06 02:34:01
【问题描述】:
我正在尝试使用 Django 的 ORM 来生成使用额外和过滤方法的查询。像这样的:
Model.objects.filter(clauseA).extra(clauseB).all()
这会生成一个查询,但问题是 filter 子句中的所有内容都与 extra 子句中的所有内容进行了 AND 运算,因此 sql 看起来像:
SELECT * FROM model WHERE clauseA AND clauseB.
我的问题是,有没有办法更改 Django 中查询的默认组合运算符,以便生成的查询为:
SELECT * FROM model WHERE clauseA OR clauseB.
【问题讨论】:
-
您是否只是在寻找or query?(可能重复)
-
不,这仅适用于过滤器方法中的参数。我需要更改默认组合器,以便从
extra()方法返回的内容与从filter()方法返回的内容进行“或”运算(而不是目前的“与”)。我在额外方法中拥有的是无法在 Django ORM 中表示且无法用Q包装的原生 SQL -
Model.objects.filter(Q(clauseA) | Q(clauseB)).all()不是一个有效的解决方案吗?我看不出你为什么需要单独的调用(根据我自己的测试,这里显示的这个过滤器会产生你想要的 sql 输出)。我确信可以更改默认组合器,但我不建议这样做 -
不,很遗憾,这行不通。我需要使用额外子句的原因是我正在使用一些不会转换为 ORM 的 Postgres 特定函数。因此不能包裹在 Q 中以传递给过滤器方法。
-
OP 想知道如何将
extra()子句与 or 而不是 and 连接起来。他为什么要这样做与这个问题无关。