0

如果我想检查是否存在并在可能的情况下检索对象,以下哪种方法更快?更地道?为什么?如果不是我列出的两个示例中的任何一个,那么人们将如何去做呢?

if Object.objects.get(**kwargs).exists():
    my_object = Object.objects.get(**kwargs)


my_object = Object.objects.filter(**kwargs)
if my_object:
    my_object = my_object[0]

如果相关,我关心 mysql 和 postgres。

4

2 回答 2

4

为什么不在 try/except 块中执行此操作以避免多个查询/查询然后是 if?

try:
    obj = Object.objects.get(**kwargs)
except Object.DoesNotExist:
    pass

只需在 except 下添加您的 else 逻辑。

于 2013-03-27T21:07:25.713 回答
2

django 提供了一个很好的概述exists

根据文档,使用您的第一个示例,它将执行两次查询:

如果 some_queryset 还没有被评估,但你知道它会在某个时候被评估,那么使用 some_queryset.exists() 将做更多的整体工作(一个查询用于存在检查加上一个额外的查询以稍后检索结果)而不是简单地使用 bool(some_queryset) 检索结果,然后检查是否返回了任何结果。

因此,如果您要使用该对象,在检查存在之后,文档建议只使用它并强制评估 1 次使用

if my_object:
  pass
于 2013-03-27T21:05:26.090 回答