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.总结:

 

 

 

 

 

 

 

 

 

 

posted @ 2019-01-15 19:45  一路向北_听风  阅读(111)  评论(0)    收藏  举报