orm--->defer和only

1.介绍

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

only() 的意思是只获取指定的字段

2. defer

2.1 测试

我们以 Blog 这个model为例对这个函数进行测试,我们获取 Blog 的数据,但是指定不获取 name 这个字段的数据:

Blog.objects.defer("name")

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

如果我们通过 select_related 关联了外键数据,也可以指定不获取外键的某些字段,

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

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

 2.3 defer 多字段

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

2.4 主键字段不能defer

有一些字段我们是 defer 也不会生效的,比如 model 的主键字段 id。

Blog.objects.defer("id")

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

假设我们通过 Entry 来关联获取 Blog 数据,那么,关联的外键字段 blog_id,则不应该被 defer(),否则会报错。

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

2.6 访问被 defer 的字段

假设我们在获取 Blog 数据的时候,defer 了 name 字段,那么我们还可以访问 name 字段吗?

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

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'}
"""

3. only

3.1 介绍

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

Entry.objects.only("headline", "rating")

3.2 多个 only 连用

如果是多个 only 连用,那么系统只有最后一个 only 的字段会生效:

作用效果跟 order_by() 一样,后面的参数会覆盖前面的。

Entry.objects.only("headline", "rating").only("body_text")  # 只会获取 body_text 字段数据

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值