2013-07-09 105 views
2

運營商,我需要運行一個Django模型下面的查詢:SQL比較函數/ Django上

SELECT * 
FROM app_model 
WHERE GREATEST(field1, fixed_value) < LEAST(field2, another_fixed_value) 

有什麼辦法,我不訴諸原始()方法運行此查詢?

回答

1

您至少可以通過使用extra來避免raw。我認爲ORM不會暴露GREATESTLEAST

從理論上講,你可以你的約束分解成不同的可能性,並or在一起:

mymodel.objects.filter(Q(field1__gt=fixed_value and field2__lt=another_fixed_value and field1__lt=field2) | \ 
         Q(field1__lte=fixed_value and field2__lt=another_fixed_value and field2__gt=fixed_value) | \ 
         Q(field1__gt=fixed_value and field2__gte=another_fixed_value and field1__lt=another_fixed_value) | \ 
         Q(field1__lte=fixed_value and field2__gte=another_fixed_value and fixed_value < another_fixed_value)) 

除了顯然,你不會真的包括and fixed_value < another_fixed_value。如果它們在字面上是固定的,並且在編寫代碼時知道它們,那麼只需進行前兩個比較 - 如果您不知道它們,則只需構建最後一個Q對象並在必要時將其添加到查詢中。

這就是說,這很可怕,我認爲extra是一個更好的選擇。

mymodel.objects.extra(where=['GREATEST(field1, fixed_value) < LEAST(field2, another_fixed_value)']) 
+0

謝謝! extra()方法是我需要的! :) – averageman

0

看看到field lookups

Model.objects.filter(id__gt=4) 

等同於:

SELECT ... WHERE id > 4; 

小於

Model.objects.filter(id__lt=4) 

等同於:

SELECT ... WHERE id < 4;