十一、REST framework接口开发:基于Minin接口实现
前言:
通过GenericAPIView封装了相关的序列化器和数据问题,对于类中的方法,DRF也提供了对应的类叫<Minin>混合类。
1、<Minin>混合类提供了ListModelMixin, CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin五个类,分别对应怎删改查查
2、ListModelMixin源码介绍及使用
class ListModelMixin: """ List a queryset. """ # 提供list方法 def list(self, request, *args, **kwargs): # 获取queryset queryset = self.filter_queryset(self.get_queryset()) # 分页功能 page = self.paginate_queryset(queryset) if page is not None: serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) # 序列化数据 serializer = self.get_serializer(queryset, many=True) # 返回结果 return Response(serializer.data)
通过源码可以看出,它和我们写的get方法多了一个分页功能,其他的都一样,那么基于ListModelMixin修改我们的get的方法
# 使用时,先继承class RequestDataView(GenericAPIView, ListModelMixin): # 新建get方法 def get(self, request, *args, **kwargs): # 使用ListModelMixin的list方法 return self.list(request, *args, **kwargs)
3、其它类用法大致一样,不在介绍,最终修改完成后的代码如下:
from rest_framework.generics import GenericAPIView from rest_framework.mixins import ListModelMixin, CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin class RequestDataView(GenericAPIView, ListModelMixin, CreateModelMixin): # 认证类,没有时为空 authentication_classes = [] permission_classes = [] # GenericAPIView提供了两个变量分别是 queryset 和 serializer_class # queryset 存放数据使用 queryset = Interface_case_data.objects.all() # 存放序列化器类 serializer_class = CaseDataSerializer # 新建get方法 def get(self, request, *args, **kwargs): # 使用ListModelMixin的list方法 return self.list(request, *args, **kwargs) # 新建post方法 def post(self, request, *args, **kwargs): return self.create(request, *args, **kwargs) class RequestDataDetailView(UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, GenericAPIView): # 认证类,没有时,注释掉 authentication_classes = [] permission_classes = [] queryset = Interface_case_data.objects.all() serializer_class = CaseDataSerializer # 结合get方法使用,默认值为lookup_field="pk" lookup_field = 'id' # 单查询 def get(self, request, *args, **kwargs): return self.retrieve(request, *args, **kwargs) # 单条数据更新,演示m2m数据更新,当没有m2m时,手动处理逻辑 def put(self, request, *args, **kwargs): return self.update(request, *args, **kwargs) def delete(self, request, *args, **kwargs): return self.destroy(request, *args, **kwargs)
4、<Minin>混合类我们简化了代码,在此基础上,generics提供 ListCreateAPIView类,帮我们再次优化代码逻辑,ListCreateAPIView源码:
# 继承ListModelMixin、CreateModelMixin、GenericAPIView class ListCreateAPIView(mixins.ListModelMixin, mixins.CreateModelMixin, GenericAPIView): """ Concrete view for listing a queryset or creating a model instance. """ def get(self, request, *args, **kwargs): return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs): return self.create(request, *args, **kwargs)
通过源码可以看出和我们之前写的代码逻辑一致,那么优化我们的代码
# 导入ListCreateAPIView from rest_framework.generics import ListCreateAPIView class RequestDataView(ListCreateAPIView): # 认证类,没有时为空 authentication_classes = [] permission_classes = [] # GenericAPIView提供了两个变量分别是 queryset 和 serializer_class # queryset 存放数据使用 queryset = Interface_case_data.objects.all() # 存放序列化器类 serializer_class = CaseDataSerializer class RequestDataDetailView(UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, GenericAPIView): # 认证类,没有时,注释掉 authentication_classes = [] permission_classes = [] queryset = Interface_case_data.objects.all() serializer_class = CaseDataSerializer # 结合get方法使用,默认值为lookup_field="pk" lookup_field = 'id' # 单查询 def get(self, request, *args, **kwargs): return self.retrieve(request, *args, **kwargs) # 单条数据更新,演示m2m数据更新,当没有m2m时,手动处理逻辑 def put(self, request, *args, **kwargs): return self.update(request, *args, **kwargs) def delete(self, request, *args, **kwargs): return self.destroy(request, *args, **kwargs)
5、generics还提供RetrieveUpdateDestroyAPIView类,帮助我们对单条数据的操作进行封装,源码中的方法与我们写的大致一样,这里不在演示源码,最终优化完成后的代码如下所示
class CaseDataSerializer(serializers.ModelSerializer): class Meta: model = Interface_case_data fields = ["parent_id", "interface_case_name", "request_data", "request_expected_results"] # 重写父类的create方法 def create(self, validated_data): # 获取数据库对象 case_data = Interface_case_data.objects.create(**self.validated_data) return case_data # 重写父类的update方法 def update(self, instance, validated_data): # pk=instance.pk 获取修改数据的主键 Interface_case_data.objects.filter(pk=instance.pk).update(**validated_data) # 修改完成后,获取新数据进行返回 updated_case = Interface_case_data.objects.get(pk=instance.pk) return updated_case # 导入ListCreateAPIView和RetrieveUpdateDestroyAPIView from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView class RequestDataView(ListCreateAPIView): # 认证类,没有时为空 authentication_classes = [] permission_classes = [] # GenericAPIView提供了两个变量分别是 queryset 和 serializer_class # queryset 存放数据使用 queryset = Interface_case_data.objects.all() # 存放序列化器类 serializer_class = CaseDataSerializer class RequestDataDetailView(RetrieveUpdateDestroyAPIView): # 认证类,没有时,注释掉 authentication_classes = [] permission_classes = [] queryset = Interface_case_data.objects.all() serializer_class = CaseDataSerializer # 结合get方法使用,默认值为lookup_field="pk" lookup_field = 'id'
6、generics还提供了其他的继承类,如 RetrieveUpdateAPIView, 当继承它时,表示只能增加和修改数据,不予许删除。其它类的用法大致相同,请自行研究。

浙公网安备 33010602011771号