我正在尝试使用Django的ORM来使用extra和filter方法生成查询。像这样:
Model.objects.filter(clauseA).extra(clauseB).all()
这会生成一个查询,但问题是filter子句中的所有内容都与“额外”子句中的所有内容相符,所以sql看起来像:
SELECT * FROM model WHERE clauseA AND clauseB.
我的问题是,有没有办法在Django中更改查询的默认组合运算符,以便生成的查询将是:
SELECT * FROM model WHERE clauseA OR clauseB.
答案 0 :(得分:3)
尝试Q object
Model.objects.filter(Q(clauseA) | ~Q(clauseB))
编辑
试试这个
Model.objects.filter(clauseA) | Model.objects.extra(clauseB)
答案 1 :(得分:0)
如果您只是删除了filter子句,并将该过滤器直接包含在Postgres特定函数的额外OR中,则可能更容易。我认为它已经是Django ORM的限制。
您可以尝试创建自己的Func expression。一旦为Postgres特定函数创建了一个函数,就可以使用Func(),F()和Q()对象的组合来摆脱那个令人讨厌的.extra()函数并很好地链接它们。 / p>