2012-08-06 80 views
3

我需要製作一個複雜的過濾器,意味着在模型屬性上應用一個函數。django複雜查詢過濾器

等效SQL查詢是:

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

其中binding_value是從客戶機接收一個數字。

有什麼方法可以使用函數定義字段查找嗎?或者我必須直接使用原始的SQL?

謝謝。

回答

4

在這種情況下,最好的辦法是使用Django的查詢集extra()方法:

MyModel.objects.extra(where=['abs(field1 - %s) <= 50'], params=[binding_value]) 
+0

它完美的作品,謝謝!! – kothvandir 2012-08-07 11:49:23

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)) 
+0

是的,它可以與這個過濾器一起工作,但是我必須在應用程序的其他部分應用其他函數,並且對查詢集使用「額外」過濾器會更加靈活。感謝您的時間。 – kothvandir 2012-08-07 11:52:31