Django exists()
およびDoesNotExist
例外についていくつか質問があります。
サンプルコード:
_id = 1
# first
if User.objects.get(pk=id).exists():
# my logic
pass
# second
try:
User.objects.get(pk=id)
# my logic
pass
except User.DoesNotExist:
return 0
_
私はよくget()
メソッドを使用します。どちらの練習が良いですか?どのコードが良いですか?最初ですか?
if User.objects.get(pk=id).exists()
これは機能しないので、質問への回答は非常に簡単です。この方法は、機能する方法よりも劣っています:-)
Minimal Complete Verifiable Example を実際に作成しなかったため、未検証のコードを投稿したときにエラーを見逃したと思います。
代わりに、次の違いについて質問していると思います。
QuerySet.exists()
QuerySetがある場合(たとえば、フィルター操作から)。
Model.objects.get(…)
および Model.DoesNotExist
例外タイプ (または、より一般的になりたい場合は、親タイプ ObjectDoesNotExist
)。
違いは:
QuerySet.exists
メソッドはクエリセットにあります。つまり、クエリについて問い合わせます(「anyこのクエリに一致するインスタンスはありますか?」)まだ特定のインスタンスを取得しようとしていません。
モデルのDoesNotExist
例外は、実際に1つのインスタンスを取得しようとしたときに存在しませんでした。
あなたの意図を正しく表現するものを使用してください。
詳細は docs :about exists()
で見つけることができますが、exists()
はQuerySetでのみ機能します
QuerySetに結果が含まれている場合はTrueを返し、含まれていない場合はFalseを返します。これは、可能な限り簡単かつ最速の方法でクエリを実行しようとしますが、通常のQuerySetクエリとほぼ同じクエリを実行します。
exists()は、QuerySetのオブジェクトメンバーシップとQuerySet内のオブジェクトの存在の両方、特に大きなQuerySetのコンテキストに関連する検索に役立ちます。
ただし、ObjectDoesNotExist
は get()
でのみ機能します。
また、別のアプローチを試すこともできます。
user = User.objects.filter(id=2)
if user:
# put your logic
pass
Djangoバージョン2.0.6の場合、以下を行うことができ、動作します:
if Model.objects.filter(my_id=objectid).exists():
myobject = get_object_or_404(Model, my_id=objectid)
context = {'myobject': myobject}
return render(request, self.template_name, context)
詳細はこちらで入手できます: https://docs.djangoproject.com/en/2.1/ref/models/querysets/
in Django model、model.objects.get()
を使用する場合、存在しない場合はエラーが発生します。その場合は、except:
とともにDoesNotExist
を使用できます
try:
val = Model.objects.get(pk=val) # if nothing found it will raise an exception
exception:
you can trace an exception without mentioning anything on top.
(or)
exception ObjectDoesNotExist:
# it will come here if exception is DoesNotExist