クエリが結果を返したかどうかをチェックするための推奨イディオムは何ですか?
例:
orgs = Organisation.objects.filter(name__iexact = 'Fjuk inc')
# If any results
# Do this with the results without querying again.
# Else, do something else...
これをチェックする方法はいくつかあると思いますが、経験豊富なDjangoユーザーがどのように行うかを知りたいと思います。ドキュメントのほとんどの例では、何も見つからなかった場合を無視しています...
if not orgs:
# Do this...
else:
# Do that...
バージョン1.2以降、DjangoにはQuerySet。exists() (メソッドがあり、最も効率的です:
if orgs.exists():
# Do this...
else:
# Do that...
ただし、とにかくQuerySetを評価する場合は、以下を使用することをお勧めします。
if orgs:
...
詳細については、 QuerySet.exists()のドキュメントをお読みください 。
膨大な数のオブジェクトがある場合、これは(時には)はるかに高速になります。
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を求めています。)
クエリセットの空を確認するには:
if orgs.exists():
# Do something
または、クエリセットの最初のアイテムを確認できます。存在しない場合は、None
を返します。
if orgs.first():
# Do something
最も効率的な方法(Django 1.2より前)は次のとおりです。
if orgs.count() == 0:
# no results
else:
# alrigh! let's continue...
述語に同意しません
if not orgs:
そのはず
if not orgs.count():
私は、かなり大きな結果セット(〜15万件の結果)で同じ問題を抱えていました。演算子はQuerySetでオーバーロードされないため、実際には、チェックが行われる前に結果がリストとして展開されます。私の場合、実行時間は3オーダー減少しました。
これも使用できます:
if(not(orgs)): #if orgs is empty else: #if orgs is not empty