244

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

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

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

4

7 に答える 7

283
if not orgs:
    # Do this...
else:
    # Do that...
于 2009-09-07T05:53:34.440 に答える
243

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

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

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

if orgs:
   ...

詳細については、QuerySet.exists()のドキュメントを参照してください。

于 2010-03-03T18:14:20.450 に答える
18

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

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

私が巨大なデータベースで取り組んでいるプロジェクトでnot orgsは、400 ミリ秒以上、250 ミリ秒orgs.count()です。私の最も一般的な使用例 (結果が得られる場合) では、この手法はしばしば 20 ミリ秒未満に短縮されます。(私が見つけた1つのケース、それは6でした。)

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

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

于 2010-01-19T23:50:08.920 に答える
18

クエリセットが空であることを確認するには:

if orgs.exists():
    # Do something

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

if orgs.first():
    # Do something
于 2015-04-20T13:56:51.303 に答える
12

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

if orgs.count() == 0:
    # no results
else:
    # alrigh! let's continue...
于 2009-09-07T06:01:57.850 に答える
6

述語に同意しません

if not orgs:

そのはず

if not orgs.count():

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

于 2011-07-30T14:33:05.133 に答える