day 090 DRF -- 视图
主要内容:
- 1.表结构 & 序列化类
- 2.初级版本
- 3.升级版本
- 4.再升级版本
- 5.总结
1.表结构 & 序列化类:
- 1.1 model
#为了简单起见,当前只创建Publisher这一个类 class Publisher(models.Model): name = models.CharField(max_length=32) def __str__(self): return self.name
- 1.2 序列化类
#使用 ModelSerializer class PublisherSerializer(serializers.ModelSerializer): class Meta: model = models.Publisher fields= '__all__'
2.初级版本
from DRF import models from rest_framework.views import APIView from rest_framework.response import Response from DRF.modelserializers import PublisherSerializer class GenericView(APIView): """把视图中可能用到的配置和方法封装起来""" queryset = None serializer_class = None def get_queryset(self): # 让每次请求来的时候都现查一次数据 return self.queryset.all() # python mixin(混合类):不能单独使用,和其它类搭配起来使用(利用了Python支持多继承) class ListMixin(object): def get(self, request): queryset = self.get_queryset() ser_obj = self.serializer_class(queryset, many=True) return Response(ser_obj.data) class CreateMixin(object): def post(self,request): 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 PublisherList(GenericView,ListMixin,CreateMixin): queryset = models.Publisher.objects.all() serializer_class = PublisherSerializer
3.版本升级
把增删改查查五个动作拆分出来,写成独立的混合类。
# 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") class PublisherList(GenericView,ListMixin,CreateMixin): queryset = models.Publisher.objects.all() serializer_class = PublisherSerializer class PublisherDetail(GenericView,RetrieveMixin,UpdateMixin,DestroyMixin): queryset = models.Publisher.objects.all() serializer_class = PublisherSerializer
注:使用内置提供的方法
from DRF import models from DRF.modelserializers import PublisherModelSerializer from rest_framework.generics import ListCreateAPIView,RetrieveUpdateDestroyAPIView class PublisherListView(ListCreateAPIView): queryset = models.Publisher.objects.all() serializer_class = PublisherModelSerializer class PublisherDetailView(RetrieveUpdateDestroyAPIView): queryset = models.Publisher.objects.all() serializer_class = PublisherModelSerializer
4.再升级版本
- 4.1 路由
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^publisher/$', views.PublisherViewSet.as_view(actions={'get': 'list', 'post': 'create'})), url(r'publisher/(?P<pk>\d+)/$', views.PublisherViewSet.as_view(actions={'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})), ]
- 4.2 视图
from DRF import models from DRF.modelserializers import PublisherSerializer from rest_framework.viewsets import ModelViewSet class PublisherViewSet(ModelViewSet): queryset = models.Publisher.objects.all() serializer_class = PublisherSerializer
5.总结: