38

django docsでこれに出くわしました

none() を呼び出すと、オブジェクトを返さないクエリセットが作成され、結果にアクセスするときにクエリは実行されません。qs.none() クエリセットは EmptyQuerySet のインスタンスです。

私は多くの CRUD アプリを作成していますが (驚き) none()、.

なぜ EmptyQuerySet を返したいのでしょうか?

4

5 に答える 5

39

通常、を提供する必要QuerySetがあるが、提供するものがない場合(メソッドの呼び出しやテンプレートへの提供など)。

利点は、結果がない(または結果が必要ない)ことがわかっていても、結果が必要な場合でもnone()、データベースにアクセスしないことです。

非現実的な例として、権限をクエリできるAPIがあるとします。アカウントが確認されていない場合は、すでにAccountオブジェクトがあり、それが確認できるaccount.is_activatedのでFalse、を使用するだけでデータベースのアクセス許可の確認をスキップできます。Permission.objects.none()

于 2013-01-12T03:30:17.600 に答える
17

クエリセットに追加したいが、最初に空のリストが必要な場合最初に空のリストをインスタンス化するが、意味のある値を徐々に追加し続ける条件と同様の例..

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 Noneorのインスタンスを返す必要があり[]ます。そうしないと、後で頭痛の種になります..

このように、条件がまったく満たされていない場合でもTrue、コードはそのまま残ります。型チェックは不要

ここでオペレーターの使用法を理解していない人のため|に:

queryset |= queryset2

それは次のように翻訳されます:

queryset = queryset + queryset
于 2015-09-04T10:23:53.480 に答える