2

値に一致するレコードを取得したいとしましょう。それを行うには 2 つの方法があります。

初め:

try:
  obj = Model.objects.get(field = value)
except
  pass

2番:

if Model.objects.filter(field = value).count() > 0:
  obj = Model.objects.filter(field_value)[0]

コードのコメントは脇に置いておきます。どの方法を使用する必要がありますか、またはどちらを読みたいですか? 最初の方法は 1 つの DB ルックアップだけなので高速に見えますが、2 番目の方法はもう少し読みやすいように見えますが、2 つの DB ルックアップが必要です。

4

2 に答える 2

11

1 つ目は、 EAFP設計原則 (「許可よりも許しを求める方が簡単」)に基づいて、Python で優先されます。速度はさておき、このシステムの利点の 1 つは、競合状態がないことです。2 番目の例では、データベースへの他の同時アクセスによって、コードの 1 行目と 2 行目の実行の間で結果が変更された場合、結果は次のようになります。矛盾する。

トランザクションの使用方法によっては、競合状態の可能性は問題にならないかもしれませんが、一般的にEAFPは Python の顕著な設計パターンであり、経験豊富な Python コーダーはその形式のコードを読むのに問題はありません。

ETA: あ、忘れてました: 使わないでexcept:ください (コロンは必要です)。except IndexError:または、探している他の特定の例外を使用します。そうすれば、データベースに到達できないなどのまったく予期しないエラーが発生した場合でも、それが伝播され、隠されることはありません。スローされた例外をカウントして「結果がない」ことを意味するコードを後で記述し、代わりにシステムが「データベースがダウンしています」と伝えようとする状況は望ましくありません。

于 2012-11-14T00:30:51.200 に答える
0

どうですか

matches = Model.objects.filter(field=value)[:1]
obj = matches[0] if matches else None

クエリは 1 回だけ評価され (条件式matchesif部分で評価する場合)、これは空チェックと結果の取得の両方に使用されます。返されるオブジェクトの数を制限するスライスに注意してください。

于 2012-11-14T00:43:12.513 に答える