django docsでこれに出くわしました
none() を呼び出すと、オブジェクトを返さないクエリセットが作成され、結果にアクセスするときにクエリは実行されません。qs.none() クエリセットは EmptyQuerySet のインスタンスです。
私は多くの CRUD アプリを作成していますが (驚き) none()
、.
なぜ EmptyQuerySet を返したいのでしょうか?
django docsでこれに出くわしました
none() を呼び出すと、オブジェクトを返さないクエリセットが作成され、結果にアクセスするときにクエリは実行されません。qs.none() クエリセットは EmptyQuerySet のインスタンスです。
私は多くの CRUD アプリを作成していますが (驚き) none()
、.
なぜ EmptyQuerySet を返したいのでしょうか?
通常、を提供する必要QuerySet
があるが、提供するものがない場合(メソッドの呼び出しやテンプレートへの提供など)。
利点は、結果がない(または結果が必要ない)ことがわかっていても、結果が必要な場合でもnone()
、データベースにアクセスしないことです。
非現実的な例として、権限をクエリできるAPIがあるとします。アカウントが確認されていない場合は、すでにAccount
オブジェクトがあり、それが確認できるaccount.is_activated
のでFalse
、を使用するだけでデータベースのアクセス許可の確認をスキップできます。Permission.objects.none()
クエリセットに追加したいが、最初に空のリストが必要な場合最初に空のリストをインスタンス化するが、意味のある値を徐々に追加し続ける条件と同様の例..
def get_me_queryset(conditionA, conditionB, conditionC):
queryset = Model.objects.none()
if conditionA:
queryset |= some_complex_computation(conditionA)
elif conditionB:
queryset |= some_complex_computation(conditionB)
if conditionC:
queryset |= some_simple_computation(conditionC)
return queryset
get_me_queryset
ほとんどの場合、django.db.models.query.QuerySet
(優れたプログラミングのため) and not None
orのインスタンスを返す必要があり[]
ます。そうしないと、後で頭痛の種になります..
このように、条件がまったく満たされていない場合でもTrue
、コードはそのまま残ります。型チェックは不要
ここでオペレーターの使用法を理解していない人のため|
に:
queryset |= queryset2
それは次のように翻訳されます:
queryset = queryset + queryset