我需要制作一个复杂的过滤器,这意味着在模型属性上应用一个函数。
等效的 SQL 查询是:
SELECT * FROM myModel_table t WHERE abs(t.field1 - :binding_value) <= 50
其中 binding_value 是从客户端接收到的数字。
有没有办法使用函数定义字段查找?还是我必须直接使用原始 sql?
谢谢你。
我需要制作一个复杂的过滤器,这意味着在模型属性上应用一个函数。
等效的 SQL 查询是:
SELECT * FROM myModel_table t WHERE abs(t.field1 - :binding_value) <= 50
其中 binding_value 是从客户端接收到的数字。
有没有办法使用函数定义字段查找?还是我必须直接使用原始 sql?
谢谢你。
在这种情况下,最好的方法是使用 Django 的 queryset extra()方法:
MyModel.objects.extra(where=['abs(field1 - %s) <= 50'], params=[binding_value])
如果我没有想错(如果我想的话,请让我现在),您可以“翻译”您的查询以使用简单的 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))
过滤注释:
from django.db.models import Func
class Abs(Func):
function = "abs"
MyModel.objects.annotate(
expr=Abs("field1") - binding_value
).filter(
expr__lte=50
)