1. ホーム
  2. パイソン

[解決済み] djangoでクエリセットから最初のオブジェクトを取得する最速の方法は?

2022-04-16 22:47:33

質問

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

これは、データベースの呼び出しを1回で済ませるもので、良いことです。 しかし、多くの場合例外オブジェクトを作成する必要があり、本当に必要なのは些細なifテストだけなのに、非常にメモリを消費することになります。

どうすれば、1回のデータベース呼び出しで、例外オブジェクトでメモリを消費することなく、これを実現できますか?

どのように解決するのですか?

Django 1.6 (2013年11月リリース) が導入されました。 便利なメソッド first()last() を返し、その結果生じた例外を飲み込んで None がオブジェクトを返さない場合。