web-dev-qa-db-ja.com

Djangoの空のクエリセットの確認

クエリが結果を返したかどうかをチェックするための推奨イディオムは何ですか?
例:

orgs = Organisation.objects.filter(name__iexact = 'Fjuk inc')
# If any results
    # Do this with the results without querying again.
# Else, do something else...

これをチェックする方法はいくつかあると思いますが、経験豊富なDjangoユーザーがどのように行うかを知りたいと思います。ドキュメントのほとんどの例では、何も見つからなかった場合を無視しています...

147
Niklas
if not orgs:
    # Do this...
else:
    # Do that...
161
Adam

バージョン1.2以降、DjangoにはQuerySet。exists()メソッドがあり、最も効率的です:

if orgs.exists():
    # Do this...
else:
    # Do that...

ただし、とにかくQuerySetを評価する場合は、以下を使用することをお勧めします。

if orgs:
   ...

詳細については、 QuerySet.exists()のドキュメントをお読みください

171

膨大な数のオブジェクトがある場合、これは(時には)はるかに高速になります。

try:
    orgs[0]
    # If you get here, it exists...
except IndexError:
    # Doesn't exist!

私が巨大なデータベースで作業しているプロジェクトでは、not orgsは400+ ms、orgs.count()は250msです。私の最も一般的な使用例(結果がある場合)で、この手法は多くの場合20ミリ秒未満になります。 (私が見つけた1つのケース、それは6でした。)

もちろん、結果を見つけるためにデータベースがどこまで見なければならないかに応じて、もっと長くなる可能性があります。または、それがすぐに見つかると、さらに速くなります。 YMMV。

編集:これはwill結果が見つからない場合、特にフィルタリングしている条件がまれな場合は特にorgs.count()よりも遅くなります。その結果、ビューが存在することを確認するか、Http404をスローする必要があるビュー関数で特に役立ちます。 (希望するところでは、人々は頻繁に存在するURLを求めています。)

14
Adam Playford

クエリセットの空を確認するには:

if orgs.exists():
    # Do something

または、クエリセットの最初のアイテムを確認できます。存在しない場合は、Noneを返します。

if orgs.first():
    # Do something
10
Tuss4

最も効率的な方法(Django 1.2より前)は次のとおりです。

if orgs.count() == 0:
    # no results
else:
    # alrigh! let's continue...
8
Bartosz

述語に同意しません

if not orgs:

そのはず

if not orgs.count():

私は、かなり大きな結果セット(〜15万件の結果)で同じ問題を抱えていました。演算子はQuerySetでオーバーロードされないため、実際には、チェックが行われる前に結果がリストとして展開されます。私の場合、実行時間は3オーダー減少しました。

5
hedleyroos

これも使用できます:

if(not(orgs)): #if orgs is empty else: #if orgs is not empty

0