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