Django モデルで次のクエリを実行する必要があります。
SELECT *
FROM app_model
WHERE GREATEST(field1, fixed_value) < LEAST(field2, another_fixed_value)
raw() メソッドに頼らずにこのクエリを実行する方法はありますか?
Django モデルで次のクエリを実行する必要があります。
SELECT *
FROM app_model
WHERE GREATEST(field1, fixed_value) < LEAST(field2, another_fixed_value)
raw() メソッドに頼らずにこのクエリを実行する方法はありますか?
raw
を使用することで、少なくとも回避できますextra
。GREATEST
それ以外の場合、ORM がorを公開するとは思わない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
。それらが文字通り修正されていて、コードを書くときにそれらを知っている場合は、最初の 2 つの比較を行うだけです。それらを知らない場合は、最後の 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;