我们需要确定对象在模型中是否可用。
有两种方法可用于检查是否存在,
MyModel.objects.filter(pk=pk).exists()
或
get_object_or_404(MyModel, pk=pk)
哪种查询更好,更有效?
注意:无需使用该对象执行任何操作(pk)。只是想知道是否存在..
答案 0 :(得分:4)
使用exists
会更快,但不是那么明显。我们可以通过记录SQL查询来查看这些查询的内容:
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
将获取表格中的所有列,exist
仅获取one
。但这绝不是一件大事。
答案 1 :(得分:1)
使用
get_object_or_404(MyModel, pk=pk)
是
的快捷方式try:
my_model = MyModel.objects.get(pk=pk)
except:
raise Http404
因此,如果您想在对象不存在时返回404错误,则只应使用get_object_or_404
。
如果您实际上不需要模型对象,那么理论上使用exists()
代替get()
会更有效,因为exists()
不会实际上返回对象:
if not MyModel.objects.exists():
raise Http404
在实践中,我不确定你是否真的会注意到这种差异。因此,您可以选择使用get_object_or_404
使代码稍微简单。