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()