惯用/快速Django ORM检查mysql / postgres上是否存在

时间:2013-03-27 21:02:14

标签: python sql django orm django-models

如果我想检查存在并且如果可能的话检索一个对象,下列哪种方法更快?更惯用吗?为什么?如果不是我列出的两个例子中的任何一个,那么怎么办呢?

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。

2 个答案:

答案 0 :(得分:4)

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

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

只需在except。下添加你的其他逻辑。

答案 1 :(得分:2)

django对exists

提供了很好的概述

根据documentation

,使用您的第一个示例,它将执行两次查询
  

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

因此,如果您要使用该对象,在检查存在后,文档建议使用它并使用

强制评估1次
if my_object:
  pass