Django的QuerySet何时被评估?

3

我看过Django的查询集是惰性的。但这是否意味着可以在一个语句中链接多个操作,还是指查询被延迟到需要结果时才执行?例如,下面的模拟代码会执行两个还是三个SQL查询?

query = Books.objects.filter(pk=book_id)
if query.exists():
  result = query.get()
else:
# ...

2
工作文档链接(开发版本):https://docs.djangoproject.com/en/dev/ref/models/querysets/#when-querysets-are-evaluated - Nathan Jones
1个回答

10
实际上,“懒惰”指的是查询被延迟到需要结果时才执行。在您的代码片段中,第一行创建了一个未评估的查询集,并且不会触发数据库操作。第二行肯定会触发SQL查询。第三行 - 如果执行 - 将再次访问数据库。
可以通过设置settings.DEBUG=True来自行验证。
>>> from django.contrib.auth.models import *
>>> from django.db import connection
>>> connection.queries
[]
>>> query = User.objects.filter(pk=1)
>>> connection.queries
[]
>>> query.exists()
True
>>> connection.queries
[{u'time': u'0.000', u'sql': u'SELECT (1) AS `a` FROM `auth_user` WHERE `auth_user`.`id` = 1  LIMIT 1'}]
>>> query.get()
<User: root>
>>> connection.queries
[{u'time': u'0.000', u'sql': u'SELECT (1) AS `a` FROM `auth_user` WHERE `auth_user`.`id` = 1  LIMIT 1'}, 
 {u'time': u'0.000', u'sql': u'SELECT `auth_user`.`id`, `auth_user`.`password`, `auth_user`.`last_login`, `auth_user`.`is_superuser`, `auth_user`.`username`, `auth_user`.`first_name`, `auth_user`.`last_name`, `auth_user`.`email`, `auth_user`.`is_staff`, `auth_user`.`is_active`, `auth_user`.`date_joined` FROM `auth_user` WHERE `auth_user`.`id` = 1 '}]
>>> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接