3

我需要制作一个复杂的过滤器,这意味着在模型属性上应用一个函数。

等效的 SQL 查询是:

SELECT * FROM myModel_table t WHERE abs(t.field1 - :binding_value) <= 50

其中 binding_value 是从客户端接收到的数字。

有没有办法使用函数定义字段查找?还是我必须直接使用原始 sql?

谢谢你。

4

3 回答 3

4

在这种情况下,最好的方法是使用 Django 的 queryset extra()方法:

MyModel.objects.extra(where=['abs(field1 - %s) <= 50'], params=[binding_value])
于 2012-08-06T21:20:48.343 回答
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))
于 2012-08-07T00:36:26.777 回答
0

过滤注释

from django.db.models import Func

class Abs(Func):
    function = "abs"

MyModel.objects.annotate(
    expr=Abs("field1") - binding_value
).filter(
    expr__lte=50
)

编辑:另见https://stackoverflow.com/a/35658634/10840

于 2018-01-18T02:23:20.633 回答