何时评估Django QuerySet?

时间:2013-11-24 06:15:05

标签: python django django-models

我读过django queryset很懒。但这是否意味着懒惰,因为我可以在一个语句上链接多个操作或者懒惰,因为查询被延迟到需要结果时。例如,以下模拟代码是否执行两个或三个SQL查询?

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

1 个答案:

答案 0 :(得分:4)

它实际上是“懒惰的,因为查询被延迟到需要结果的时候”。在您的代码段中,第一行创建一个未评估的查询集,但不会访问数据库。第二行确实触发了SQL查询。第三行 - 如果执行 - 将第二次击中DB。

如果您设置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 '}]
>>>