drf高级之——GenericAPIView的使用

我们可以使用使用GenericAPIView+序列化类+Response写接口

 

了解GenericAPIView

 

类属性:

queryset:要序列化的所有数据
serializer_class:序列化类
lookup_field = 'pk' :查询单条时的key值,默认为pk,可以修改名称如'id'(同时urls路由层的过滤器的名称也得相同<int:id>)

  

方法:

-get_queryset():获取所有要序列化的数据【后期可以重写】
-get_serializer  : 返回序列化类
-get_object :获取单个对象

  

 

使用示例:

首先需要导入模块:

from rest_framework.generics import GenericAPIView

 

在类中继承GenericAPIView

class BookView(GenericAPIView):

 

书写要序列化的数据和序列化类:

queryset = Book.objects.all()  # 要序列化的图书qs对象
serializer_class = BookSerialzier  # 序列化类(从seriailzer中导入 —— from .serializer import BookSerialzier)

 

 调用方法:

    def get(self, request):
        qs = self.get_queryset()
        ser = self.get_serializer(qs, many=True)
        return Response({'code': 100, 'msg': '成功', 'results': ser.data})

    def post(self, request):
        ser = self.get_serializer(data=request.data)
        if ser.is_valid():
            ser.save()
            return Response({'code': 100, 'msg': '成功'})
        else:
            return Response({'code': 100, 'msg': ser.errors})

 

查、改(代码全貌):

class BookDetailView(GenericAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerialzier

    def get(self, request, pk):
        book = self.get_object()
        ser = self.get_serializer(book)
        return Response({'code': 100, 'msg': '成功', 'results': ser.data})

    def put(self, request, pk):
        book = self.get_object()
        ser = self.get_serializer(data=request.data, instance=book)
        if ser.is_valid():
            ser.save()
            return Response({'code': 100, 'msg': '更新成功'})
        else:
            return Response({'code': 100, 'msg': ser.errors})

 

总结:

继承GenericAPIView写接口必须遵循以下原则:

1 必须配置类属性
    	queryset
        serializer_class

2 想获取要序列化的所有数据
    	get_queryset()

3 想使用序列化类:
    	get_serializer()

4 想拿单条
    	get_object()

  





posted @ 2023-11-24 09:53  wellplayed  阅读(40)  评论(0编辑  收藏  举报