繁体   English   中英

何时评估Django QuerySet?

[英]When is a Django QuerySet evaluated?

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

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

它实际上是“懒惰的,因为查询被延迟到需要结果的时候”。 在您的代码段中,第一行创建了一个未评估的查询集,并且未触及数据库。 第二行肯定会触发SQL查询。 第三行(如果执行)将第二次命中数据库。

如果您设置settings.DEBUG=True ,则可以自己通过FWIW进行检查。DEBUG 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 '}]
>>> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM