新代系统使用期限密码▉▉▉【一电一-】▉▉defer的英语单词的意思是延迟、推迟,我们可以通过将字段作为参数传入,可以达到在获取数据的时候指定不获取该字段数据,常用于一些textfield字段上。
假设我们有一个TestModel,有一个字段名为text_field,字段类型为textfield,里面存了大量字符串数据.
那么如果我们再获取这个model数据的时候,只想要这个model的其他字段信息,text_field字段的内容我们在这一次用不上,那么我们就可以通过defer()方法来指定不获取该字段内容。
因为对于这一类大容量数据,系统在从数据库中fetch数据的时候会花费大量时间,而这部分不必要的时间我们是可以避免的。
("text_field")上面的语句将text_field这个字段名作为参数传入defer()函数,系统返回数据的时候将不会返回他的字段。
我们以Blog这个model为例对这个函数进行测试,我们获取Blog的数据,但是指定不获取name这个字段的数据:
("name")我们可以打印一下这条命令执行的SQL语句:
("name").query.__str__()SELECT`blog_blog`.`id`,`blog_blog`.`tagline`FROM`blog_blog`
可以看到转化的SQL语句没有把我们指定的name字段返回。
不获取外键关联的某些字段
如果我们通过select_related关联了外键数据,也可以指定不获取外键的某些字段,比如:
_related("blog").defer("blog__name")这样,在获取关联的blog的数据的时候,就不会获取blog的name字段数据。
defer多字段
('headline','body_text')主键字段不能defer
有一些字段我们是defer也不会生效的,比如model的主键字段id。
("id")上面的操作,系统不会报错,但是也不会生效。
关联外键数据,外键数据不应该被defer
假设我们通过Entry来关联获取Blog数据,那么,关联的外键字段blog_id,则不应该被defer(),否则会报错。
访问被defer的字段,系统会再次请求数据库"""这个时候再次打印出blog.__dict__内容是:{'_state':,'id':1,'tagline':'asd','name':'hunter'}"""