2016-04-09 2 views
2

オブジェクトがモデルで使用可能かどうかを確認する必要があります。 2つの方法が存在するかどうかを確認するために利用されているDjango get_object_or_404またはフィルタが存在する

MyModel.objects.filter(pk=pk).exists() 

またはクエリが良いと効率的である

get_object_or_404(MyModel, pk=pk) 

注:そのオブジェクト(pk)を使用してアクションを実行する必要はありません。存在するかどうかを知りたいだけです。

+0

HTTP 404が存在しないかどうかを確認しますか? – Ben

+0

@Ben利用できないデータがHttp404を返す必要がある場合は – Muthuvel

+0

'get_object_or_404'を使用してください - これはそのためです! – Ben

答えて

3

existsを使用する方が高速ですが、それほど明白ではありません。

import logging 
l = logging.getLogger('django.db.backends') 
l.setLevel(logging.DEBUG) 
l.addHandler(logging.StreamHandler()) 

User.objects.filter(pk=1).exists() 
get_object_or_404(User, pk=1) 

# (0.000) SELECT (1) AS "a" FROM "users" WHERE "users"."id" = 1 LIMIT 1; args=(1,) 
# (0.001) SELECT "users"."id", "users"."password", ... FROM "users" WHERE "users"."id" = 1; args=(1,) 

次に、答えが明らかになりました。彼らはほとんど同じクエリを持っていますが、get_object_or_404はテーブル内のすべての列を取得しますが、existoneしか取得しません。しかしこれは大したことではありません。

get_object_or_404(MyModel, pk=pk) 

を使用して

1

を使用すると、オブジェクトが存在しない時に404エラーを返すようにしたい場合は

try: 
    my_model = MyModel.objects.get(pk=pk) 
except: 
    raise Http404 

ためだけget_object_or_404を使用する必要があるためのショートカットです。

あなたが実際にモデルオブジェクトを必要としない場合exists()が実際にオブジェクトを返さないので、その後、理論的には、exists()代わりのget()を使用する方が効率的である。実際には

if not MyModel.objects.exists(): 
    raise Http404 

、あなたが実際にその違いに気づくかどうかはわかりません。したがって、コードを少しシンプルにするためにget_object_or_404を使用することもできます。

関連する問題