運營商,我需要運行一個Django模型下面的查詢:SQL比較函數/ Django上
SELECT *
FROM app_model
WHERE GREATEST(field1, fixed_value) < LEAST(field2, another_fixed_value)
有什麼辦法,我不訴諸原始()方法運行此查詢?
運營商,我需要運行一個Django模型下面的查詢:SQL比較函數/ Django上
SELECT *
FROM app_model
WHERE GREATEST(field1, fixed_value) < LEAST(field2, another_fixed_value)
有什麼辦法,我不訴諸原始()方法運行此查詢?
您至少可以通過使用extra
來避免raw
。我認爲ORM不會暴露GREATEST
或LEAST
。
從理論上講,你可以你的約束分解成不同的可能性,並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)'])
Model.objects.filter(id__gt=4)
等同於:
SELECT ... WHERE id > 4;
小於
Model.objects.filter(id__lt=4)
等同於:
SELECT ... WHERE id < 4;
謝謝! extra()方法是我需要的! :) – averageman