我需要製作一個複雜的過濾器,意味着在模型屬性上應用一個函數。django複雜查詢過濾器
等效SQL查詢是:
SELECT * FROM myModel_table t WHERE abs(t.field1 - :binding_value) <= 50
其中binding_value是從客戶機接收一個數字。
有什麼方法可以使用函數定義字段查找嗎?或者我必須直接使用原始的SQL?
謝謝。
我需要製作一個複雜的過濾器,意味着在模型屬性上應用一個函數。django複雜查詢過濾器
等效SQL查詢是:
SELECT * FROM myModel_table t WHERE abs(t.field1 - :binding_value) <= 50
其中binding_value是從客戶機接收一個數字。
有什麼方法可以使用函數定義字段查找嗎?或者我必須直接使用原始的SQL?
謝謝。
在這種情況下,最好的辦法是使用Django的查詢集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))
是的,它可以與這個過濾器一起工作,但是我必須在應用程序的其他部分應用其他函數,並且對查詢集使用「額外」過濾器會更加靈活。感謝您的時間。 – kothvandir 2012-08-07 11:52:31
from django.db.models import Func
class Abs(Func):
function = "abs"
MyModel.objects.annotate(
expr=Abs("field1") - binding_value
).filter(
expr__lte=50
)
它完美的作品,謝謝!! – kothvandir 2012-08-07 11:49:23