Django-rest-framework 接口实现 了解 GenericAPIView

进化写法GenericAPIView

面向对象的封装 将同样的 方法以及对象 封装到一起

  • 将 对数据库相关的 功能封装到一起 GenericAPIView

    from rest_framework.generics import GenericAPIView 中实现了这个类

        # 继承APIView
    class GenericView(APIView):
        ''' 继承这个类 重写 两个变量  queryset  serializer_class '''
    	
        # 定义要查询的 model对象 queryset
        queryset = None
        
        # 定义要使用的  序列化类
        serializer_class = None
    	
        # 定义方法 重新查询 类变量 因为类变量有缓存的问题  重新查询保证 是最新的数据
        def get_queryset(self, *args, **kwargs):
            return self.queryset.all()
    	
        # 定义获取 queryobj 的 方法   在对单条信息操作时使用
        def get_object(self, request, pk, *args, **kwargs):
            return self.get_queryset(*args, **kwargs).filter(pk=pk).first()
    
  • 增删改查查 对应的 关系

    • 新增: post: create
    • 删除: delete: destroy
    • 修改: put: update
    • 查所有: get: list
    • 查一条: get: retrieve
  • 注意:

    • 如果直接使用的 话 将方法的 名字改为 对应的 小写的请求
# python mixin(混合类):不能单独使用,和其它类搭配起来使用(利用了Python支持多继承)

class ListMixin(object):
    def list(self, request, *args, **kwargs):
        queryset = self.get_queryset()
        ser_obj = self.serializer_class(queryset, many=True)
        return Response(ser_obj.data)

# 创建一条记录
class CreateMixin(object):
    def create(self, request, *args, **kwargs):
        ser_obj = self.serializer_class(data=request.data)
        if ser_obj.is_valid():
            ser_obj.save()
            return Response("ok")
        else:
            return Response(ser_obj.errors)


# 获取具体某一条记录
class RetrieveMixin(object):
    def retrieve(self, request, pk, *args, **kwargs):
        obj = self.get_object(request, pk, *args, **kwargs)
        if obj:
            # 2. 将书籍对象 序列化成 json格式的数据
            ser_obj = self.serializer_class(obj)
            # 3. 返回响应
            return Response(ser_obj.data)
        else:
            return Response("无效的id")


class UpdateMixin(object):
    def update(self, request, pk, *args, **kwargs):
        obj = self.get_object(request, pk, *args, **kwargs)
        if obj:
            ser_obj = self.serializer_class(instance=obj, data=request.data, partial=True)  # form组件中也有类似的实现
            if ser_obj.is_valid():
                ser_obj.save()
                return Response(ser_obj.data)
            else:
                return Response(ser_obj.errors)
        else:
            return Response("无效的id")


class DestroyMixin(object):
    def destroy(self, request, pk, *args, **kwargs):
        obj = self.get_object(request, pk, *args, **kwargs)
        if obj:
            obj.delete()
            return Response("删除成功")
        else:
            return Response("无效的id")

重写的 定义 方法 因为将方法名改了 django 在dispatch 方法 反射请求的 时候找不到对应的 方法 Generic

# 重新定义一个  中间类  继承 需要的操作  

class ListCreateView(GenericView, ListMixin, CreateMixin):
    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

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

可以通过 更改类的继承来调用对应的 方法

  • 视图中CBV 只需要重写两个类变量 并继承相应的类

    • 此写法 要使用原始的 方法名 原生请求 -->get /post/put/delete
    # 作者
    class AuthorListView(GenericView, ListMixin, CreateMixin):
        queryset = models.Author.objects.all()
        serializer_class = AuthorModelSerializer
    
    
    class AuthorDetailView(GenericView, RetrieveMixin, UpdateMixin, DestroyMixin):
        queryset = models.Author.objects.all()
        serializer_class = AuthorModelSerializer
    

**rest_framework 中有已经定义好的 工具类 直接继承 本篇用于 了解 DRF **

posted @ 2019-02-27 22:03  拐弯  阅读(733)  评论(0编辑  收藏  举报