【问题标题】:When does the SQL execute in Django ORMSQL 什么时候在 Django ORM 中执行
【发布时间】:2018-11-11 02:56:44
【问题描述】:

首先,我举个例子:

# Student is a model class, and it has attributes: name, age, gender and so on.
temp_students = Student.objects.filter(age=18)
students = temp_students.filter(gender='girl')

如果我调试这段代码,我可以得到一个 SQL,它可能是 "SELECT * FROM student WHERE age = 18"(称为 SQL-A)。然后,当我到达第二行时,我可能会得到另一个 SQL,即"SELECT * FROM student WHERE gender = 'girl' IN (SELECT * FROM student WHERE age = 18)"(称为 SQL-B)。

那么,我的问题是 SQL-A 和 SQL-B 什么时候执行?它是否连接到数据库两次,并获得两个结果集?在这种情况下,数据库是否有任何不必要的支出?如果不是这样,为什么我可以在 DEBUG MODE 中获得 SQL 的样子?

如果您的答案末尾有任何相关的 Django ORM 文档或文章,那就太好了。

谢谢!

【问题讨论】:

标签: django database python-3.x django-models orm


【解决方案1】:

Django 查询集是“惰性的”——这意味着它们只有在评估后才执行数据库操作。

例如这里:

queryset1 = Student.objects.filter(...)
queryset2 = queryset1.filter(...)

for i in queryset2:
    print(i)

在上面的示例中,查询集仅在到达 for 循环时才被评估,那是它实际访问数据库的时候。它将使用一个 SQL 查询,该查询是基于先前的过滤器语句构造的。

Django 文档中的更多信息:https://docs.djangoproject.com/en/2.0/topics/db/queries/#querysets-are-lazy

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-23
    • 2021-12-30
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多