Published in:2024-10-24 |

drf-day4

1. 群体修改

局部修改

DRF默认没有提供修改多个对象的方法,需要自己通过ListSerializer来重写update方法来实现修改多个对象的逻辑

  • ListSerializer使用方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class BookListSerializer(serializers.ListSerializer):
"""
使用此序列化器完成更新多个对象
"""

# 重写update方法完成更新
def update(self, instance, validated_data):
print(instance) # 要修改的实例
print(validated_data) # 要修改的实例的值

# TODO 将修改多个 改变成循环中每次修改一个
for index, obj in enumerate(instance):
# 每遍历一次 就修改一个对象的数据
self.child.update(obj, validated_data[index])

return instance


class BookModelSerializerV2(serializers.ModelSerializer):
class Meta:
model = Book
# fields应该写哪些字段 应该填写序列化与反序列化所需字段的并集
fields = ("book_name", "price", "publish", "authors", "pic")

# 指定修改多个的序列化器
list_serializer_class = BookListSerializer
1
2
3
4
5
# 总结
1. 前端参数按照一定的格式来传递,在视图中处理前端传递的参数
2. 校验前端传递的参数,将参数对应的实例查询出来并存放
3. 将要修改的实例以及实例对应的要更新的值传递到序列化器
4. DRF默认没有提供同时修改多个对象的方法,需要自己继承`ListSerializer`并重写`update()`来完成更新

2. DRF视图Generics与mixins

DRF中有四大视图组件: viewsgenericsmixinsviewset

views: DRF原生的视图模块,提供最基本的视图访问方式

mixins: 五大工具类,分别提供不同的操作方式

generics: 方法视图,提供内置操作对象以及序列化器的方法

viewset: 视图集

generics.GenericAPIView

generics.GenericAPIView:主要作用是提供了三个方法,分别是:

get_queryset:可以通过在类视图指定的queryset属性来获取指定模型的所有数据

get_serializer: 通过当前类视图指定的serializer_class属性来获取当前视图要使用的序列化器

get_object: 获取要操作的单个对象,通过url指定的参数来查询要操作的单个对象

lookup_field:来指定url参数的名称

mixins五大工具视图

mixins提供了多种查询API,需要与generics.GenericAPIView共同继承使用

CreateModelMixin: 创建单个对象

ListModelMixin: 查询所有

RetrieveModelMixin:查询单个

UpdateModelMixin:更新单个

DestroyModelMixin:删除单个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# GenericAPIView继承APIView  两者是完全兼容的
# 重点分析GenericAPIView在APIView基础上完成了哪些事情
class BookGenericAPIView(GenericAPIView,
mixins.ListModelMixin,
mixins.RetrieveModelMixin,
mixins.DestroyModelMixin,
mixins.CreateModelMixin,
mixins.UpdateModelMixin):
# 获取当前视图要操作的模型数据
queryset = Book.objects.filter()
# 获取当前视图要使用的序列化器
serializer_class = BookModelSerializerV3

lookup_field = "id"

def get(self, request, *args, **kwargs):
if "id" in kwargs:
return self.retrieve(request, *args, **kwargs)

return self.list(request, *args, **kwargs)

def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)

def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)

def put(self, request, *args, **kwargs):
return self.partial_update(request, *args, **kwargs)

generics工具视图

1、generics工具视图同时继承GenericAPIViewmixins模块下的各个工具类,所以继承了不同类的视图就拥有对应的操作方法

2、工具类视图为你混合好了各种常见的API操作,只需要继承各种工具类视图,提供querysetserializer_class即可完成对应的操作

3、如果都是查询操作,则无法同时实现查询单个与查询多个

1604040418216

3. DRF视图 viewsets

主要目的:当执行的不是标准的http行为,让开发者可以将http请求映射到自定义的方法函数中

视图集的核心:ViewSetMixin ,继承此类就拥有了自定义视图以及路由映射的能力

  1. ViewSet继承的是APIViewViewSetMixin ,没有提供任何默认的方法,所有的逻辑都需要自己实现
  2. GenericViewSet继承了GenericAPIViewViewSetMixin,提供了与mixins混合使用的三个方法,只需要继承对应的mixins工具类即可使用对应的方法
  3. ModelViewSet: 继承了GenericViewSet与所有的mixins工具类

路由定义

1
2
path("set/", views.BookViewSetView.as_view({"post": "user_login", "get": "get_user_count"})),
path("set/<str:id>/", views.BookViewSetView.as_view({"post": "user_login", "get": "get_user_count"})),

视图开发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class BookViewSetView(viewsets.GenericViewSet, mixins.ListModelMixin):
queryset = Book.objects.all()
serializer_class = BookModelSerializerV3

def user_login(self, request, *args, **kwargs):
# 可以在此完成登录的逻辑
request_data = request.data
print("登录成功")
return Response("登录成功")

def get_user_count(self, request, *args, **kwargs):
# 完成获取用户数量的逻辑
print("查询成功")
return self.list(request, *args, **kwargs)

4. DRF视图的继承关系

1604045151455

作业

1
2
3
4
5
1. 掌握ListSerializer的使用方式
2. 掌握generics与mixins视图的使用方式
3. 掌握视图集viewset的开发方式
注册接口 登陆接口
4. 梳理DRF视图的继承关系
Prev:
Next: