Django のクエリセットから最初のオブジェクトを取得する最も速い方法は? 質問する

Django のクエリセットから最初のオブジェクトを取得する最も速い方法は? 質問する

Django のクエリセットから最初のオブジェクトを取得したり、Noneない場合は返したりしたいことがよくあります。これを行うには、すべて機能する方法がたくさんあります。しかし、どれが最もパフォーマンスが高いのか疑問に思っています。

qs = MyModel.objects.filter(blah = blah)
if qs.count() > 0:
    return qs[0]
else:
    return None

これにより、データベース呼び出しが 2 回発生しますか? 無駄に思えます。 この方が速くなりますか?

qs = MyModel.objects.filter(blah = blah)
if len(qs) > 0:
    return qs[0]
else:
    return None

別の選択肢としては、次のものがあります。

qs = MyModel.objects.filter(blah = blah)
try:
    return qs[0]
except IndexError:
    return None

これにより、単一のデータベース呼び出しが生成されますが、これは良いことです。ただし、多くの場合、例外オブジェクトを作成する必要があり、実際に必要なのは単純な if テストだけである場合、これは非常に多くのメモリを消費する作業になります。

例外オブジェクトでメモリを大量に消費することなく、単一のデータベース呼び出しだけでこれを行うにはどうすればよいですか?

ベストアンサー1

Django 1.6 (2013 年 11 月リリース)導入した便利な方法 first()クエリセットがオブジェクトを返さない場合、last()結果の例外を飲み込んで戻ります。None

おすすめ記事