惯用/快速 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 上是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

Django中ORM介绍

django基础之ORM

占位先

使用 Django ORM 进行选择性事务管理

使用 Django ORM 进行快速移动平均计算

django入门 05 orm连接mySQL,调整表结构