我需要创建一个复杂的过滤器,意味着在模型属性上应用函数。
等效的SQL查询是:
SELECT * FROM myModel_table t WHERE abs(t.field1 - :binding_value) <= 50
其中binding_value是从客户端收到的数字。
有没有办法使用funcion定义字段查找?或者我是否必须直接使用原始sql?
谢谢。
答案 0 :(得分:4)
在这种情况下,最好的方法是使用Django的queryset extra()方法:
MyModel.objects.extra(where=['abs(field1 - %s) <= 50'], params=[binding_value])
答案 1 :(得分:3)
如果我没有想错路(如果我现在请现在就让我),你可以“翻译”你的查询,使用简单的django过滤。
首先,它是真的:
abs(A - B) <= 50
等于:
-50 <= A - B <= 50
然后,这等于:
-50 + B <= A <= 50 + B
然后,您的查询可能是这样的:
MyModel.objects.filter(field1__range=(-50+binding_value,50+binding_value))
答案 2 :(得分:0)
from django.db.models import Func
class Abs(Func):
function = "abs"
MyModel.objects.annotate(
expr=Abs("field1") - binding_value
).filter(
expr__lte=50
)