django如何实现存在性检查

Posted

技术标签:

【中文标题】django如何实现存在性检查【英文标题】:How does django implement existence check 【发布时间】:2014-11-09 04:55:24 【问题描述】:

对于以下查询:

res = People.objects.all().exists()

django 到底在做什么,使用 mysql 后端?是不是如下:

cursor.execute('SELECT * FROM people')
results = cursor.fetchall()
if results:
    res = True
else:
    res = False

或者,它是否使用了更优化的东西,例如:

cursor.execute('SELECT 1 FROM people')
if cursor.fetchone():
    res = True
else:
    res = False

【问题讨论】:

为什么不检查查询本身?在 shell 中使用 connection.queries,或者在您的应用程序中使用 Django 调试工具栏。 @DanielRoseman 你能告诉我如何使用connection.queries 在视图代码中对此进行分析吗? @PeterDeGlopper exists().query 不起作用。 exists() 返回一个布尔值。 【参考方案1】:

Django 总是尝试优化exists() 查询。对于mysql,它使用LIMIT 1

SELECT 1 FROM people LIMIT 1

正如 Daniel 在 cmets 中所说,您可以通过查看 connection.queries 来探索 Django 进行的底层查询:

from django.db import connection

res = People.objects.all().exists()
print connection.queries

在How can I see the raw SQL queries Django is running?查看更多信息

仅供参考,django.db.models.sql.Query 类中的has_results() 方法负责构造exists() 查询。

【讨论】:

以上是关于django如何实现存在性检查的主要内容,如果未能解决你的问题,请参考以下文章

如何检查一个元素是不是存在于 Django 查询集中?

Django:如何检查自定义小部件定义中是不是存在字段错误?

如何检查我在 Django 中制作的模型中是不是存在用户?

在让用户使用pyotp创建新密码之前如何实现基于OTP的验证?

Django:如何实现系统标志

如何通过按钮更改 Django 模板使用的 CSS?