十一、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, 当继承它时,表示只能增加和修改数据,不予许删除。其它类的用法大致相同,请自行研究。

posted @ 2025-01-03 09:36  蜗牛·哥  阅读(25)  评论(0)    收藏  举报