drf 改写视图函数

最初是通过改写get等方法,代码如下

class PublishView(APIView):

    def get(self, request):
        publish_list = models.Publish.objects.all()
        bs = PublishSerializers(publish_list, many=True)
        # 序列化数据

        return Response(bs.data)

    def post(self, request):
        # 添加一条数据
        print(request.data)

        bs=PublishSerializers(data=request.data)
        if bs.is_valid():
            bs.save()  # 生成记录
            return Response(bs.data)
        else:

            return Response(bs.errors)

然后将重复部分自己抽出

class List():
    def list(self,request, *args, **kwargs):
        response = {'status': 100, 'msg': '查询成功'}
        books=self.model

        books_ser=self.model_ser(instance=books,many=True)
        response['data']=books_ser.data
        return Response(response)


class Create():
    def create(self,request, *args, **kwargs):
        response = {'status': 100, 'msg': '新增成功'}
        try:
            book_ser = self.model_ser(data=request.data)
            if book_ser.is_valid():
                book_ser.save()
                response['data'] = book_ser.data
            else:
                response['msg'] = book_ser.errors

        except Exception as e:
            response['msg'] = str(e)
        return Response(response)
class BooksView(List,Create,APIView):
    model=models.Book.objects.all()//要序列化的数据queryset对象
    model_ser=BookSerializer//使用的序列化类
    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self,request):
        return self.create(request)
注意这里的model_ser和mode相当于下面的serializer_class(序列化器)和queryset(视图查询集)这里继承的是APIView基本视图

用drf提供的mixin改写试图函数,抽取相同部分进行封装

from rest_framework.mixins import CreateModelMixin,ListModelMixin,DestroyModelMixin,RetrieveModelMixin,UpdateModelMixin
from rest_framework.generics import GenericAPIView
class BooksView(CreateModelMixin,ListModelMixin,GenericAPIView):
    serializer_class=BookSerializer
    queryset=models.Book.objects.all()
    def post(self,request,*args, **kwargs):
        return self.create(request,*args, **kwargs)
    def get(self,request,*args, **kwargs):
        return self.list(request,*args, **kwargs)

上面继承的是GenericAPIView,因为使用mixin需要用到,他继承了APIView斌在其基础上上添加了查询视图和详情视图的通用支持,如queryset和serializer_class,但发现多个视图时仍有post等相同部分,再次进行封装,使用generics

from rest_framework.generics import ListAPIView,ListCreateAPIView,RetrieveUpdateDestroyAPIView,DestroyAPIView,CreateAPIView
#它有两个接口,一个是获取所有,一个是新增
class BooksView(ListCreateAPIView):
    serializer_class=BookSerializer
    queryset=models.Book.objects.all()

这里只需要继承上述引入的view即可,但其可控性差,而且还需要分多各类所以有modelviewset但

最终,一般用的时候,会经常用ViewSetMixin
ViewSetMixin干了什么事?重写了as_view方法
from rest_framework.viewsets import ViewSetMixin
class Publish(ViewSetMixin,APIView):

    def aa(self,request):
        return HttpResponse('aa')
    def bb(self,request):
        return HttpResponse('aa')
    def cc(self,request):
        return HttpResponse('aa')
    def dd(self,request):
        return HttpResponse('aa')
    def get_all(self,request):
        pass
    def get_one(self,request):
        pass
    def create(self,request):
        pass
    def create_by_id(self,request):
        pass

上面继承的两个类中viewsetmixin必须放在前面,因为viewsetmixin本质是改写了asview方法,放后面会执行APIView中的asviw,另外上面这种方法的url为(列举)

 url(r'^test', views.Publish.as_view({'get':'aa'})),

url(r'^xx', views.Publish.as_view({'post':'cc'})),

表示什么请求执行其中的什么方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值