1. ホーム
  2. django

[解決済み] Django の filter と get は単一オブジェクトの場合?

2022-04-25 12:19:35

質問

このことについて同僚と議論していました。 Django でオブジェクトを取得する際、1つしか期待していない場合に好ましい方法はありますか?

明らかな方法は2つです。

try:
    obj = MyModel.objects.get(id=1)
except MyModel.DoesNotExist:
    # We have no object! Do something...
    pass

そして

objs = MyModel.objects.filter(id=1)

if len(objs) == 1:
    obj = objs[0]
else:
    # We have no object! Do something...
    pass

最初の方法は動作的にはより正しいと思われますが、制御フローに例外を使用するため、若干のオーバーヘッドが発生する可能性があります。 2番目の方法は、より遠回りですが、例外を発生させることはありません。

どちらが望ましいか、ご意見をお聞かせください。 どちらがより効率的でしょうか?

解決方法は?

get() が用意されています。 このケースに特化した . 使ってください。

オプション 2 は、ほぼ正確に get() メソッドは Django で実際に実装されているので、パフォーマンスの違いはないはずです (そして、それを考えているということは、プログラミングの基本的なルールの 1 つ、つまり、コードを書いてプロファイリングする前に最適化しようとすることに違反していることを示しています -- コードを持って実行するまで、それがどう動作するかわかりませんし、それ以前に最適化しようとするのは苦痛の道です)。