新代系统使用期限密码▉▉▉【一电一-】▉▉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'}"""