Django笔记十二之defer/only指定返回字段

科技资讯 投稿 12200 0 评论

Django笔记十二之defer/only指定返回字段

本篇笔记将介绍查询中的 defer 和 only 两个函数的用法,笔记目录如下:

    defer
  1. only

1、defer

延迟、推迟,我们可以通过将字段作为参数传入,可以达到在获取数据的时候指定不获取该字段数据,常用于一些 textfield 字段上。

那么如果我们在获取这个 model 数据的时候,只想要这个 model 的其他字段信息,text_field 字段的内容我们在这一次用不上,那么我们就可以通过 defer( 方法来指定不获取该字段内容。

TestModel.objects.defer("text_field"

上面的语句将 text_field 这个字段名作为参数传入 defer( 函数,系统返回数据的时候将不会返回他的字段。

Blog.objects.defer("name"

我们可以打印一下这条命令执行的 SQL 语句:

Blog.objects.defer("name".query.__str__(
SELECT `blog_blog`.`id`, `blog_blog`.`tagline` FROM `blog_blog`

可以看到转化的 SQL 语句没有把我们指定的 name 字段返回。

不获取外键关联的某些字段

Entry.objects.select_related("blog".defer("blog__name"

这样,在获取关联的 blog 的数据的时候,就不会获取 blog 的 name 字段数据。

defer 多字段

Entry.objects.defer('headline', 'body_text'

主键字段不能defer

Blog.objects.defer("id"

上面的操作,系统不会报错,但是也不会生效。

关联外键数据,外键数据不应该被 defer

# 下面的写法会报错
Entry.objects.select_related("blog".defer("blog_id"

访问被 defer 的字段

答案是可以的,不过因为我们在第一步的时候没有获取该字段,所以访问该字段的时候,系统会再次请求一遍数据库。

blog = Blog.objects.defer("name".first(

"""
这个时候打印出 blog 的所有字段是:
blog.__dict__
{'_state': <django.db.models.base.ModelState object at 0x7fb2de420668>, 'id': 1, 'tagline': 'asd'}
"""

print(blog.name # 访问被 defer 的字段,系统会再次请求数据库

"""
这个时候再次打印出 blog.__dict__ 内容是:
{'_state': <django.db.models.base.ModelState object at 0x7fb2de420668>, 'id': 1, 'tagline': 'asd', 'name': 'hunter'}
"""

2、only

与 defer( 方法的作用相反,only( 的意思是只获取指定的字段,比如:

Entry.objects.only("h

编程笔记 » Django笔记十二之defer/only指定返回字段

赞同 (65) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽