Django get_object_or_404或过滤器存在

时间:2016-04-09 09:48:35

标签: python django filter

我们需要确定对象在模型中是否可用。

有两种方法可用于检查是否存在,

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

get_object_or_404(MyModel, pk=pk)

哪种查询更好,更有效?

注意:无需使用该对象执行任何操作(pk)。只是想知道是否存在..

2 个答案:

答案 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使代码稍微简单。