orm查询优化 MTV和MVC模型 字段的chioces参数 Ajax
1|0一、ORM查询优化
- 遵循能少走一次数据库就少走一次,即一次查询操作中能少用SQL查询语句就尽量少用。
1|11. all()查询
-
惰性查询 减少不必要的数据库操作 降低数据库的压力
-
1|22. only()/defer()方法
(1)only()方法
-
only()
括号内放字段 查询结果是一个列表套一个个的数据对象,即queryset对象。 -
这些数据对象点括号内的字段不会再查询数据库,直接就是对象获取属性
-
也支持点括号内没有的字段,但是每点一次就会重新走一次数据库查询,此时查询效率极低。
-
实例
(2)defer()方法
-
defer()
与only()
是互为反操作 -
defer()
括号内放什么字段 查询出来的对象就没有该字段属性 -
如果你要对象点括号内的字段,每点一次就要重新走一次数据
-
而你如果点击了非括号内的字段,就不会走数据库,仅仅是对象点属性的操作
-
实例
1|33. select_related()/prefetch_related()
(1)select_related()
-
select_related原理是联表查询
-
select_related括号内只能放外键字段 并且外键字段的类型只能是一对多 或者 一对一 不能是多对多
-
内部是自动联表操作,会将括号内外键字段所关联的表,与当前表自动拼接成一张表
-
然后将表中的数据一个个查询出来封装成一个个的对象,这样做的好处就在于跨表也不需要重复的走数据库了,减轻数据库的压力
-
耗时:主要在联表时耗时(数据库层的操作)
-
实例
(2)prefetch_related()
-
prefetch_related原理是子查询
-
自动帮你按步骤查询多张表,然后将查询的结果封装到对象中,用户的感觉好像还是联表操作
-
括号内支持传多个外键字段,并且没有类型限制
-
特点:每放一个外键字段,就会多走一条sql语句,多查询一张表
-
耗时:查询的次数上的耗时
-
实例
(3)select_related()/prefetch_related()的优缺点
- 没有谁比谁好,结合实际情况,使用不同方法。
- 如两张表都太大时,联表时会把不需要的一些数据行也连接在一起成一张大表,不但消耗更多的时间,也浪费内存,因为联表是数据库层的操作,所以还会增加数据库的负担。此时,用
prefetch_related()
方法更好。
2|0二、MTV与MVC模型
- 这两个东西都是纯理论,没有特别的意思。
2|11. MTV模型
-
MTV
- M:models
- T:templates
- V:views
-
django自称为是MTV框架 本质其实还是MVC
2|22. MVC模型
- MVC
- M:models
- V:views
- C:controller 路由匹配
3|0三、chioces参数
chioces
参数的作用是把一些数据信息映射成一个简单的字符串或者数字,在保存数据时只需要保存这些简单的字符串或数字即可,以此可以节省数据库资源。- 取值:
- 只要是
choices
字段类型,在获取值的时候 统一句式:get_字段名_display()
。 若直接以对象点字段的方式,则获取到的是我们自定义chioces
参数的值的每个元组中的第一个元素。
- 只要是
- 插入数据:
- 当我们在插入数据时,若插入
chioces
参数的自定义值中没有的数据,可以插入成功。在使用get_字段名_display()
取值时,因为元组中没有第二个元素,不会报错,取值也只会取到第一个元素。这里不是很好理解,看下面的实例。
- 当我们在插入数据时,若插入
- 实例
4|0四、Ajax
-
Ajax 不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的Web应用程序的技术
-
Ajax 特点:异步提交,局部刷新
-
AJAX 最大的作用是在不重新加载整个页面的情况下,可以与服务器交换数据并更新网页的部分内容。(这一特点给用户的感受是在不知不觉中完成请求和响应过程)-
-
题外话:
- 每家公司都会有属于这家公司独有的内部管理软件
- 专门用来开发企业内部管理软件框架 ——》 odoo
- odoo框架内部功能实现全部依赖于python2
4|11. Ajax语法
(1)起手语法
(2)Ajax基本语法结构
-
-
实例
- 注意:一旦你使用了ajax,django中必知必会三板斧(
render/HttpResponse/redirect
)都不再作用与页面,而是与recv_data交互,即这三个方法返回到前端的数据都被接收中recv_data中
5|0五、前端传输数据的编码格式
- 前端发到后端的数据都有数据编码格式,针对不同的数据,后端会自动进行不同的处理
- 前端中,只要你的数据满足urlencoded格式,不管你当前的编码格式是什么,django后端都会自动解析,并且根据你的提交方式帮你封装到
request.GET或request.POST
中- urlencoded编码格式对应的数据的格式:
username=jason&password=123
- urlencoded编码格式对应的数据的格式:
5|11. 常见的编码格式
- urlencoded
- formdata
- application/json
5|22. form表单发送数据的编码格式
- form标签的控制编码格式的属性:
enctype
(1)urlencoded编码格式
-
form表单默认编码格式是urlencoded
-
urlencoded编码格式对应的数据格式:
-
-
django后端针对urlencoded数据,会自动解析,帮你封装到
request.POST
中
(2)formdata编码格式
- 传文件时用的编码格式
- 传文件必须做到两件事:
- 必须将其默认的urlencoded换成formdata
- 提交数据方式改为post
- 针对formdata格式的数据,你在浏览器上是无法查看到,因为这时的提交方式肯定是post
- 如果你是一个文件对象,django后端也会自动识别帮你放到
request.FILES
中
(3)json格式
- form表单无法发送json格式的数据 你要想法 你只能借助于ajax。
5|33. ajax发送数据的编码格式
- ajax能够发送3种格式的数据:
- urlencoded
- formdata
- application/json
(1)urlencoded编码格式
- ajax默认的编码格式也是urlencoded 也就意味着后端django也是会自动解析,并且帮你封装到request.POST`中
(2)formdata编码格式
-
文件对象的数据,django后端会自动识别并存放在
request.FILES
中 -
Ajax传文件的实例:
-
牢记实例中的1, 2, 3, 4 四点。
-
以下MyFormData添加的前3条数据在后端会自动存放在
request.POST
中,最后一个文件数据会在后端自动存放在request.FILES
中。
(3)application/json编码格式
-
django后端针对json格式的数据,不会做任何处理,数据怎么来的,只会原封不动的放到
request.body
中,需要你自己手动处理。(即到后端还是二进制类型的json格式的数据) -
ajax传输json格式数据实例:
-
注意:实例中的1, 2 两点
- 后端对前端的ajax传输过来的json格式的数据的反序列化
6|0六、后端数据的序列化
-
在实际开发环境中,针对前后端分离的模式,因为此时不能使用django的模板语法,后端返回到前端的数据需要非常多、非常清晰,并且是json格式的数据。如:要返回当前数据来自哪张表,数据要有描述即字典类型,还有等等,我们此时就需要自己手动书写,这样就会非常麻烦,也不保证没有缺漏的数据。
-
针对上面的问题,通过django中的内置模块
serializers
就可以完美解决了。 -
实例:
__EOF__

本文链接:https://www.cnblogs.com/Mcoming/p/11960875.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!