Django中的延迟对象和限制查询对象

时间:2013-10-23 15:27:28

标签: django django-models django-templates django-views

问题非常集中在Lazy Django对象上,是他调用的查询缓存,我想了解Django的工作方式是:

#1
data = Query.objects.all()
dato = data[5]

与:

相同
#2
dato = Query.objecs.all()[5]

问题是要了解Django缓存是否导致对象Lazy#1在视图中等于#2?或者如果相反,#1需要更长时间才能调用所有对象,然后再调用5个?

更像是一个我不理解的Django理论问题。

2 个答案:

答案 0 :(得分:1)

  

在内部,可以构造,过滤,切片并通常传递QuerySet而不实际访问数据库。在您执行评估查询集的操作之前,实际上不会发生数据库活动。

#1
data = User.objects.all()
dato = data[5]

#2
dato = User.objecs.all()[5]

#sql-script
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` LIMIT 1
OFFSET 5
  1. 两个查询的SQL脚本相同。
  2. 代码段#1将比#2代码片段更长时间,因为它有两行可供执行。
  3. 此处,速度基于更少的线路执行
  4. 为了了解Django在终端中查询执行时间和原始SQL查询,请使用此命令python manage.py shell_plus --print-sql

答案 1 :(得分:0)

据我所知,如何解析Python(这不是很多),这两个例子必须做同样的事情。在解析第二个时,Python将对Query.objects.all()进行与第一个相同的调用,然后采用第六个元素。