首页 > 其他分享 >Django笔记十二之defer、only指定返回字段

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

时间:2023-04-22 19:32:34浏览次数:44  
标签:defer name Django blog 获取 only objects

本文首发于公众号:Hunter后端 原文链接:Django笔记十二之defer、only指定返回字段

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

  1. defer
  2. only

1、defer

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

假设我们有一个 TestModel,有一个字段名为 text_field,字段类型为 textfield,里面存了大量字符串数据.

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

因为对于这一类大容量数据,系统在从数据库中 fetch 数据的时候会花费大量时间,而这部分不必要的时间我们是可以避免的。

TestModel.objects.defer("text_field")

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

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

Blog.objects.defer("name")

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

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

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

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

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

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

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

defer 多字段

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

主键字段不能defer

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

Blog.objects.defer("id")

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

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

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

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

访问被 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'}
"""

2、only

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

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

与之对应的 SQL 是:

SELECT `blog_entry`.`id`, `blog_entry`.`headline`, `blog_entry`.`rating` FROM `blog_entry`

同样的,如果访问没有指定的字段,系统会再次查询数据库。

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

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

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

defer 和 only 连用

我们可以尝试一下 defer 和 only 的先后顺序,字段是否相同,前者的字段覆盖后者,以及后者的字段覆盖前者等情况,这里不做展开了。

因为,一般人谁会把这个两个函数一起用呢。。。。。。

以上就是本篇笔记所有内容,下一篇笔记将介绍 get_or_create,update_or_create 等方法。

标签:defer,name,Django,blog,获取,only,objects
From: https://blog.51cto.com/u_16061969/6215478

相关文章

  • Django 知识库:path()路径映射
    网站地址是由统一资源定位符表示的,也是就我们常说的url。Django中有非常强大的path()方法,可以动态构造出你想要的各种不同形态的url。基本写法如下:fromdjango.urlsimportpathurlpatterns=[#固定地址path('articles/2003/',...),#可传入int参......
  • Django—Form两种解决表单数据无法动态刷新的方法
    一、无法动态更新数据的实例#Createyourmodelshere.classClasses(models.Model):title=models.CharField(max_length=32)def__str__(self):returnself.titleclassTeacher(models.Model):name=models.CharField(max_length=32)t2c=model......
  • 如何评价 ChatGPT 回答策略的 ensure only ethical usage 特质
    有人批评ChatGPT的回答策略是ensureonlyethicalusage,如何理解这句话?这句话的意思是,ChatGPT被批评的回答策略只是确保其在伦理上的使用,即遵循道德和法律规范。这意味着ChatGPT的开发者们试图避免ChatGPT被用于违反伦理或法律规定的行为,例如欺诈、虚假宣传、人身攻击、歧视等......
  • django常用命令
    Django常用命令如下:创建Django项目:django-adminstartprojectproject_name该命令会创建一个名为project_name的Django项目创建Django应用程序:pythonmanage.pystartappapp_name该命令会在Django项目中创建一个名为app_name的应用程序。启动Django服务器: pythonmanag......
  • django项目结构
    Django项目结构的详细说明如下:project_name/项目名称,即项目的根目录。manage.pyDjango项目管理工具,可以用它来执行很多操作,如启动服务器、创建数据库等。project_name/项目包,它是存放项目的所有Python代码的地方,该目录下应该包含__init__.py文件,表示该目录是一个Python包。......
  • django实现文件上传、删除、下载
    django文件上传定义一个包含FileFiled的类ModelWithFileField,其中upload字段的upload_to参数表示上传的文件存放在什么地方classModelWithFileField(models.Model):filename=models.CharField(max_length=100,verbose_name="文件名称")upload_date=models.Date......
  • django-restful:购物车 学习记录
    购物车就有获取购物车详情加入购物车删除购物记录同样直接使用mixins中的就够了view这里面没有一个陌生的基本都是前面学习过了的classShoppingCartViewset(viewsets.ModelViewSet):"""购物车功能list:获取购物车详情create:......
  • Django框架——静态文件配置、form表单、request对象、连接数据库、ORM简介、ORM基本
    配置文件介绍SECRET_KEY='0yge9t5m9&%=of**qk2m9z^7-gp2db)g!*5dzb136ys0#)*%*a'#盐DEBUG=True#调试模式,等项目上线的时候,改成False#配置数据库DATABASES={'default':{'ENGINE':'django.db.backends.sqlite3',#默认是自......
  • drf之多表关联反序列化保存read_only与write_only
    目录read_only与write_only示例假如前端传入了一组数据:{name:'赛尔达传说:王国之泪',price:350,publish:1,authors:[1,2]}如上:publish按id传入,authors也按id传入。read_only与write_onlyread_only用于序列化write_only用于反序列化这两个是字段参数示例#......
  • 通过django-background-tasks执行定时任务
    1.安装django-background-taskspipinstalldjango-background-tasks2.在Django项目的settings.py文件中添加以app:INSTALLED_APPS=[#otherapps'background_task',]3.创建一个包含需要执行的任务函数:frombackground_taskimportbackgroundimportrando......