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

57 Django模型层3与数据传输与Ajax

2024-03-31 Web开发

一、orm查询优化

能少走数据库就少走数据库。

1.only与defer

only:取对象,对象中只包含主键和only括号里的属性。

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

这些数据对象通过点的方式取括号内的字段属性不会再查询数据库,直接就是对象获取属性。只需要查一次数据库就可以全取出。

不过only也可以点击括号内没有的字段,但是每点击一次就会重新走一次数据库查询,效率极低。

res = models.Book.objects.only('title') for i in res: print(i.title) # 走一次 for i in res: print(i.price) # 走11次,有几个对象走几次

defer:与only相反,排除括号内的字段。

defer与only是互为反操作。

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

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

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

res = models.Book.objects.defer('title') # print(res) for i in res: print(i.title) # 有几个对象走几次 for i in res: print(i.price) # 走一次 2.select_related与prefatch_related

select_related:用来优化查询外键的操作。

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

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

然后将表中的数据一个个查询出来封装成一个个的对象。

这样做的好处就在于跨表也不需要重复的走数据库了,减轻数据库的压力 。

select_related括号内可以放多个外键字段(不能是多对多),逗号隔开,会将多个外键字段关联的表与当前表通过sql语句的join方法全部拼成一张大表。

耗时:数据库层面需要先连表,耗时耗在连表需要的时间。

res = models.Book.objects.select_related('publisher') for i in res: print(i.title) print(i.publisher)

prefatch_related:prefetch_related内部是子查询。

会自动帮你按步骤查询多张表 ,然后将查询的结果封装到对象中。

给用户的感觉好像还是连表操作。实际内部方法不一样。

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

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

耗时:查询的次数长,耗时耗在查询次数上。

res = models.Book.objects.prefetch_related('publisher','authors') for i in res: print(i.title) print(i.publisher)

两者之间的优缺点:

需要结合实际情况,看表的大小。

在两张表都特别大的情况下,连表操作可能耗时更多。

二、模型层choices参数

choices参数是模型层中字段的参数,choices属性的值需要为一个提前定义的对应关系容器。

容器内写数字integerfield(也可以是字符charfield)与状态的对应关系,以元组的形式存在一个大元组里。

# models class User(models.Model): sex_choices = ( (1,'男'), (2,'女'), (3,'不愿透露'), ) sex = models.IntegerField(choices=sex_choices) # 该字段存数字 # 可以存提前定义好的关系中的数字,也可以存不在关系中的数字 # 但是取得时候,也可以正常取,但取的是数字 # test # 字段中存choices字段类型时,如果想要取出数字对应的值需要用‘get_字段名_display()’方法来获取 user_obj = models.User.objects.get(pk=1) user_obj1 = models.User.objects.get(pk=4) # print(user_obj.gender) # print(user_obj1.gender) # 可以正常取,但,是数字 # print(user_obj.get_gender_display()) print(user_obj1.get_gender_display()) # 没有对应关系,获取到的还是数字本身 三、MTV与MVC模型 1.MVC

MVC(Model View Controller 模型-视图-控制器)

是一种Web架构的模式。特点:把业务逻辑、模型数据、用户界面分离开来,让开发者将数据与表现解耦。

Model: 代表数据存取层,

View: 代表的是系统中选择显示什么和怎么显示的部分,

Controller: 指的是系统中根据用户输入并视需要访问模型,以决定使用哪个视图的那部分。

2.MTV

Django框架就是MTV结构的。其实本质还是MVC。

MTV(Model Templates View 模型-模板-视图):

1.Models:数据存取层。

该层处理与数据相关的所有事务: 如何存取、如何验证有效,是一个抽象层,用来构建和操作你的web应用中的数据,模型是你的数据的唯一的、权威的信息源。它包含你所储存数据的必要字段和行为。通常,,每个模型对应数据库中唯一的一张表。

2.模板(templates):即表现层。

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