2

Django モデルで次のクエリを実行する必要があります。

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

raw() メソッドに頼らずにこのクエリを実行する方法はありますか?

4

2 に答える 2

1

rawを使用することで、少なくとも回避できますextraGREATESTそれ以外の場合、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)'])
于 2013-07-09T23:22:24.420 に答える
0

フィールド ルックアップを見てみましょう

   Model.objects.filter(id__gt=4)

次と同等です。

SELECT ... WHERE id > 4;

未満

Model.objects.filter(id__lt=4)

次と同等です。

SELECT ... WHERE id < 4;
于 2013-07-09T23:10:49.307 に答える