1004.Django项目用户功能之关联序列化及访问限流

发布时间 2023-05-25 14:32:01作者: 興華

一、路由器

1. SimpleRouter 该路由器包括标准集合——list、create、retrieve、update、partial_update、destroy动作的路由。视图集中还可以使用@detail_route或@list_route装饰器标记要被路由的其他方法;

2. DefaultRouter 这个路由器类似于上面的SimpleRouter,但是还包括一个默认返回所有列表视图的超链接的API根视图。它还生成可选的,json样式格式后缀的路由。

二、逻辑删除

我们并不是要真正的做删除,而是进行逻辑删除,逻辑删除的数据也应该无法查询、获取,所有我们需要对代码进行修改!

1. 修改模型类,在models.py文件中增加is_delete属性,重写delete方法

2. 修改视图集进行数据过滤

models.py重写delete方法,增加is_delete属性

serializers.py定义is_delete为不展示项目

views.py定义is_delete为True的不进行反馈!

三、关联序列化器

在进行关联序列化器作业时,需要将原Students模型类相关的代码以及数据全部删除,如何操作了?

1. 将所有代码中涉及到Students模型类的全部进行注释,然后进行映射并上传;

2. 数据库中查看,即可看到关于students的数据库已经删除!

1. StringRelateField

新增classes模型类

配置相关信息序列化serializer.py,视图集views.py,路由器urls.py

访问classes网页

访问students网页

添加班级信息,学生信息,并给学生分配班级后,但网页显示中并为看到学生信息中班级信息的展示,此时就需要用到关联模型的__str__方法了。

将关联模型的__str__方法返回值序列化出来! 使用方法,在对应关联项的序列化器类中定义: 外键字段=serializer.StringRelateField(read_only=True)

在学生的序列化器中添加班级的展示,再次访问时即可看到学生信息中包含班级信息!

但又出现另外一个问题,就是班级添加栏消失了!如何做到学生信息中展示班级信息,且班级添加修改栏仍然存在了?就要使用到source的方法了!

2. source

序列化器增加一个字段引入另外一个模型的字段数据,使用方法,在对应关联项的序列化器类中定义:新增字段=serializers.CharField(source=‘classes.name’, read_only=True)

将序列化serializer.py文件中学生的序列化进行修改

再次方位学生信息页面是,就可以看到学生信息中包含班级信息,且下方班级添加修改栏仍然存在!

那在学生信息中展示了班级信息,如何在班级信息中展示学生的信息了?就需要用到下面介绍的序列化嵌套了!

3. 序列化器嵌套

在学生关联的班级序列化器中添加以下方法:

访问班级网页,即可看到班级下展示了对应所有学生的信息!但一般并非需要展示学生的所有信息,可以新建一个选择展示器并调用

再次访问班级信息是,即可看到班级信息中学生信息按id、name、age、sex信息进行展示!(我测试未成功,咨询原因中!)

四、拓展

1. 视图集新增额外功能: 默认只为标准的增删改查行为生成了路由信息,如果想让自定义的行为也生成路由,需要在定义行为上使用action装饰器!

例如:查看班级最后一个班级信息

views.py文件中在班级视图集中定义last方法,并确认在使用action装饰前后前端访问情况!

2. 限流Throttling  可以对接口访问的频次进行限制,以减轻服务器压力;可以使用second、minute、hour、day来指明周期。(参考官网Throttling使用方法!)

setting.py文件中添加限流