当前位置:首页 > Web开发 > 正文

orm查询优化 MTV和MVC模型 字段的chioces参数 Ajax

2024-03-31 Web开发

一、ORM查询优化

遵循能少走一次数据库就少走一次,即一次查询操作中能少用SQL查询语句就尽量少用。

1. all()查询

惰性查询 减少不必要的数据库操作 降低数据库的压力

res = models.Book.objects.all() # 针对这行代码,如果不使用res,则不会执行数据库查询的。

2. only()/defer()方法 (1)only()方法

only()括号内放字段 查询结果是一个列表套一个个的数据对象,即queryset对象。

这些数据对象点括号内的字段不会再查询数据库,直接就是对象获取属性

也支持点括号内没有的字段,但是每点一次就会重新走一次数据库查询,此时查询效率极低。

实例

res = models.Book.objects.only('title') print(res) for i in res: print(i.title) # 只会走最初的那一次,这行不走数据库 print(i.price) # 除了最初查询走的那一次,每到这一行都会再走一次数据库进行查询

(2)defer()方法

defer()与only()是互为反操作

defer()括号内放什么字段 查询出来的对象就没有该字段属性

如果你要对象点括号内的字段,每点一次就要重新走一次数据

而你如果点击了非括号内的字段,就不会走数据库,仅仅是对象点属性的操作

实例

res = models.Book.objects.defer('title') print(res) for i in res: print(i.title) # 除了最初查询走的那一次,每到这一行都会再走一次数据库进行查询 print(i.price) # 只会走最初的那一次,这行不走数据库 3. select_related()/prefetch_related() (1)select_related()

select_related原理是联表查询

select_related括号内只能放外键字段 并且外键字段的类型只能是一对多 或者 一对一 不能是多对多

内部是自动联表操作,会将括号内外键字段所关联的表,与当前表自动拼接成一张表

然后将表中的数据一个个查询出来封装成一个个的对象,这样做的好处就在于跨表也不需要重复的走数据库了,减轻数据库的压力

select_related括号内可以放多个外键字段,逗号隔开,会将这些外键字段关联的表与当前表全部拼成一张大表

耗时:主要在联表时耗时(数据库层的操作)

实例

res = models.Book.objects.select_related('publish') # publish为外键字段 print(res) for i in res: print(i.title) # title为普通字段 , 只是对象点属性获取属性值,不走数据库 print(i.publish) # 只是对象点属性获取属性值,不走数据库 (2)prefetch_related()

prefetch_related原理是子查询

自动帮你按步骤查询多张表,然后将查询的结果封装到对象中,用户的感觉好像还是联表操作

括号内支持传多个外键字段,并且没有类型限制

特点:每放一个外键字段,就会多走一条sql语句,多查询一张表

耗时:查询的次数上的耗时

实例

res = models.Book.objects.prefetch_related('publish','authors') # publish 和 authors都是外键字段, publish是一对多的外键字段,authors是多对多的建立第三张表的虚拟外键字段 print(res) for i in res: print(i.title) # 只是对象点属性获取属性值,不走数据库 print(i.publish) # 只是对象点属性获取属性值,不走数据库 (3)select_related()/prefetch_related()的优缺点

没有谁比谁好,结合实际情况,使用不同方法。

如两张表都太大时,联的表时会把不需要的一些数据行也连接在一起成一张大表,不但消耗更多的时间,也浪费内存,因为联表是数据库层的操作,所以还会增加数据库的负担。此时,用prefetch_related()方法更好。

二、MTV与MVC模型

这两个东西都是纯理论,没有特别的意思。

1. MTV模型

MTV

M:models

T:templates

V:views

django自称为是MTV框架 本质其实还是MVC

2. MVC模型

MVC

M:models

V:views

C:controllar 路由匹配

三、chioces参数

chioces参数的作用是把一些数据信息映射成一个简单的字符串或者数字,在保存数据时只需要保存这些简单的字符串或数字即可,以此可以节省数据库资源。

取值:

只要是choices字段类型,在获取值的时候 统一句式: get_字段名_display() 。 若直接以对象点字段的方式,则获取到的是我们自定义chioces参数的值的每个元组中的第一个元素。

插入数据:

当我们在插入数据时,若插入chioces参数的自定义值中没有的数据,可以插入成功。在使用get_字段名_display()取值时,,因为元组中没有第二个元素,不会报错,取值也只会取到第一个元素。这里不是很好理解,看下面的实例。

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/42303.html