web-dev-qa-db-ja.com

Django exists()vs DoesNotExist

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()メソッドを使用します。どちらの練習が良いですか?どのコードが良いですか?最初ですか?

16

if User.objects.get(pk=id).exists()

これは機能しないので、質問への回答は非常に簡単です。この方法は、機能する方法よりも劣っています:-)

Minimal Complete Verifiable Example を実際に作成しなかったため、未検証のコードを投稿したときにエラーを見逃したと思います。


代わりに、次の違いについて質問していると思います。

違いは:

  • QuerySet.existsメソッドはクエリセットにあります。つまり、クエリについて問い合わせます(「anyこのクエリに一致するインスタンスはありますか?」)まだ特定のインスタンスを取得しようとしていません。

  • モデルのDoesNotExist例外は、実際に1つのインスタンスを取得しようとしたときに存在しませんでした。

あなたの意図を正しく表現するものを使用してください。

22
bignose

詳細は docs :about exists()で見つけることができますが、exists()はQuerySetでのみ機能します

QuerySetに結果が含まれている場合はTrueを返し、含まれていない場合はFalseを返します。これは、可能な限り簡単かつ最速の方法でクエリを実行しようとしますが、通常のQuerySetクエリとほぼ同じクエリを実行します。

exists()は、QuerySetのオブジェクトメンバーシップとQuerySet内のオブジェクトの存在の両方、特に大きなQuerySetのコンテキストに関連する検索に役立ちます。

ただし、ObjectDoesNotExistget() でのみ機能します。

また、別のアプローチを試すこともできます。

user = User.objects.filter(id=2)
if user:
    # put your logic
    pass
3

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/

0
Raymond Mlambo

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