视图集ViewSet
使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中:
- list() 提供一组数据
- retrieve() 提供单个数据
- create() 创建数据
- update() 保存数据
- destory() 删除数据
ViewSet视图集类不再实现get()、post()等方法,而是实现动作 action 如 list() 、create() 等。
代码如下
from rest_framework.response import Response from rest_framework.viewsets import ViewSet from .models import * from .serializers import Classesserializers import json class GetView(ViewSet): # 获取多条数据 def list(self, request): data = Classes.objects.all() serial = Classesserializers(data, many=True) return Response(serial.data) # 添加数据 def create(self, request): data = request.data print(data) ser = Classesserializers(data=data) ser.is_valid() # 验证 if (ser.errors): return Response({'error': ser.errors}) # 保存,信息正确保存到后端数据库 ser.save() return Response(ser.data) # 更新数据 def update(self, request, pk): data = json.loads(request.body.decode()) try: cls = Classes.objects.get(pk=pk) except: return Response({'error': '该班级不存在'}) ser = Classesserializers(cls, data, partial=True) ser.is_valid() if (ser.errors): return Response({'error': ser.errors}) ser.save() return Response(ser.data) # 获取单条数据 def retrieve(self, request, pk): try: cls = Classes.objects.get(pk=pk) except: return Response({'error': '该班级不存在'}) ser = Classesserializers(cls) return Response(ser.data) # 删除数据 def destory(self, request, pk): Classes.objects.get(pk=pk).delete() return Response({})
继承自APIView
,作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。
路由
from .Viewset import GetView urlpatterns=[ path('getviews/',GetView.as_view({'get':'list','post':'create'})), path('getviews/<int:pk>',GetView.as_view({'get':'retrieve','put':'update','delete':'destory'})) ]
继承GenericViewSet
class GetView(GenericViewSet): # 指定查询集 queryset=Classes.objects.all() # 指定序列化器 serializer_class=Classesserializers