惯用/快速 Django ORM 检查 mysql/postgres 上是不是存在
Posted
技术标签:
【中文标题】惯用/快速 Django ORM 检查 mysql/postgres 上是不是存在【英文标题】:Idiomatic/fast Django ORM check for existence on mysql/postgres惯用/快速 Django ORM 检查 mysql/postgres 上是否存在 【发布时间】:2013-03-27 21:02:14 【问题描述】:如果我想检查是否存在并尽可能检索对象,以下哪种方法更快?更地道?为什么?如果不是我列出的两个示例中的任何一个,那么其他人会怎么做呢?
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。
【问题讨论】:
【参考方案1】:为什么不在 try/except 块中执行此操作以避免多个查询/查询然后是 if?
try:
obj = Object.objects.get(**kwargs)
except Object.DoesNotExist:
pass
只需在 except 下添加你的 else 逻辑。
【讨论】:
这比我提到的第二种情况快吗?【参考方案2】:django 对exists
提供了很好的概述
根据documentation,使用您的第一个示例,它将执行两次查询:
如果 some_queryset 尚未评估,但您 知道它会在某个时候,然后使用 some_queryset.exists() 将做更多的整体工作(一个查询存在检查加上一个 额外的一个以稍后检索结果)而不是简单地使用 bool(some_queryset),它检索结果然后检查是否 任何一个都被退回了。
因此,如果您要使用该对象,在检查是否存在之后,文档建议您只使用它并强制评估 1 次使用
if my_object:
pass
【讨论】:
感谢分享。到目前为止,我在我的模型类中天真地编写了 exists() 函数。以后我将使用内置的东西以上是关于惯用/快速 Django ORM 检查 mysql/postgres 上是不是存在的主要内容,如果未能解决你的问题,请参考以下文章