django复杂查询过滤器

时间:2012-08-06 21:12:22

标签: django django-models

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

等效的SQL查询是:

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

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

有没有办法使用funcion定义字段查找?或者我是否必须直接使用原始sql?

谢谢。

3 个答案:

答案 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)

Filter on an annotation

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