rest_framework05:GenericAPIView用法/扩展类5个/子类9个/ViewSetMixin 自定义方法名字

GenericAPIView

1.视图层类使用GenericAPIView继承,能简化类里的方法code。

2.简化后的方法code格式基本通用,简单修改即可应用到其他类。

一、class开始加入

    queryset = Book.objects
    serializer_class = BookModelSerializer

二、方法里获取对象

a.查询一个使用,如需要pk值查询

book = self.get_object()

b.查询多个,如获取所有对象

 book = self.get_queryset()

c.序列化方法使用self.get_serializer()

括号内原来是什么参数,就写什么参数,如

instance=book, data=request.data,

many=True

三、代码views.py

from app01.models import Book
from app01.ser import BookSerializer,BookModelSerializer
from rest_framework.response import Response
from rest_framework.generics import GenericAPIView
# 自己学的response
from app01.utils import MyResponse

# 基于GenericAPIView
class BookView(GenericAPIView):
    queryset = Book.objects
    serializer_class = BookModelSerializer
    def get(self, request, pk):
        book = self.get_object()
        book_ser = self.get_serializer(book)
        return Response(book_ser.data)


    def put(self, request, pk):
        response = MyResponse()

        book = self.get_object()
        book_ser = self.get_serializer(instance=book, data=request.data)
        # 要数据验证
        if book_ser.is_valid():  # 返回True 表示验证通过
            book_ser.save()
            response.data = book_ser.data
        else:
            response.status= 101
            response.msg = '数据校验失败'
            response.data= book_ser.errors
        return Response(response.get_dic)

    def delete(self, request, pk):
        ret = Book.objects.filter(pk=pk).delete()
        return Response({'status': 100, 'msg': '删除成功'})


class BooksView(GenericAPIView):
    queryset = Book.objects
    serializer_class = BookModelSerializer
    # 使用封装response
    def get(self, request):
        response=MyResponse()
        book = self.get_queryset()
        book_ser = self.get_serializer(book, many=True)  # 序列化多条。 如果一条,不需要写
        response.data = book_ser.data
        return Response(response.get_dic)

    # 新增

    def post(self, request):
        response=MyResponse()
        # 新增没有instance,只有data
        book_ser = self.get_serializer(data=request.data)
        # 如果没有data=,会报错。第一个参数是instance
        # book_ser = BookSerializer(request.data)

        # 校验字段
        if book_ser.is_valid():
            book_ser.save()
            response.data = book_ser.data
        else:
            response.status = 102
            response.msg = '新增数据校验失败'
            response.data = book_ser.data
        return Response(response.get_dic)

5个视图扩展类

分别如下,

ListModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin,RetrieveModelMixin
from app01.models import Book
from rest_framework.mixins import ListModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin,RetrieveModelMixin


# 5个扩展类
class Books3View(GenericAPIView,ListModelMixin,CreateModelMixin):
    queryset = Book.objects
    serializer_class = BookModelSerializer
    def get(self,request):
        return self.list(request)

    def post(self,request):
        return self.create(request)

class Book3DetailView(GenericAPIView,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin):
    queryset = Book.objects
    serializer_class = BookModelSerializer
    def get(self,request,pk):
        return self.retrieve(request,pk)

    def put(self,request,pk):
        return self.update(request,pk)

    def delete(self,request,pk):
        return self.destroy(request,pk)

GenericAPIView的视图子类 9个

create,update等对应方法可以单独继承,也有组合的类继承,所以有9个。

# 基于 GenericAPIView的视图子类9个
from rest_framework.generics import CreateAPIView,ListAPIView,UpdateAPIView,RetrieveAPIView,DestroyAPIView,ListCreateAPIView,RetrieveUpdateAPIView,RetrieveDestroyAPIView,RetrieveUpdateDestroyAPIView

# class Books4View(ListAPIView,CreateAPIView):
class Books4View(ListCreateAPIView):
    queryset = Book.objects
    serializer_class = BookModelSerializer

# class Book4DetailView(UpdateAPIView,RetrieveAPIView,DestroyAPIView):
class Book4DetailView(RetrieveUpdateDestroyAPIView):
    queryset = Book.objects
    serializer_class = BookModelSerializer

ModelViewSet

简写成一个class,路由需要特别写法。

urls.py

  path('books5/', views.Books5View.as_view(actions={'get':'list','post':'create'})),
  re_path('^books5/(?P<pk>\d+)', views.Books5View.as_view(actions={'get':'retrieve','put':'update','delete':'destroy'})),

views.py

# 使用ModelViewSet编写5个接口
from rest_framework.viewsets import ModelViewSet
class Books5View(ModelViewSet):
    queryset = Book.objects
    serializer_class = BookModelSerializer

使用ViewSetMixin 自定义方法名字

path('books6/', views.Books6View.as_view(actions={'get': 'get_all_book'})),

# 使用ViewSetMixin 自定义方法名字
from rest_framework.viewsets import ViewSetMixin

# ViewSetMixin一定放在前面,重写as_view方法
class Books6View(ViewSetMixin,GenericAPIView):

    def get_all_book(self,request):
        books = Book.objects.all()
        book_ser = BookSerializer(books, many=True)
        return Response(book_ser.data)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
帮我把下列代码的case后内容和 “nStepMode =” 后的内容进行调换 switch (nThirdStepMode) { case PM_UNKNOWN_MODE: { // 无法识别的第三方工步号 return false; } break; case PM_STEP_REST: { nStepMode = WORK_HOLD; } break; case PM_STEP_RANDOM_REST: { nStepMode = WORK_HOLD_RANDOM; } break; case PM_STEP_SYN_SUSPEND: { // 无法识别的第三方工步号 return false; } break; case PM_STEP_PAUSE: { nStepMode = WORK_PAUSE; } break; case PM_STEP_STOP_X: { // 无法识别的第三方工步号 return false; } break; case PM_CONST_POWER_CHARGE: { nStepMode = WORK_CP; } break; case PM_CONST_POWER_DISCHARGE: { nStepMode = WORK_DP; } break; case PM_CONST_RESISTANCE_CHARGE: { nStepMode = WORK_CR; } break; case PM_CONST_RESISTANCE_DISCHARGE: { nStepMode = WORK_DR; } break; case PM_STEP_INCUBATOR_LINK: { // TODO:处理 温箱联动 return false; } break; case PM_CONST_CURRENT_CHARGE: { nStepMode = WORK_CC; } break; case PM_CONST_CURRENT_DISCHARGE: { nStepMode = WORK_DC; } break; case PM_STEP_C_RATE_CHARGE: { nStepMode = WORK_CRATE; } break; case PM_STEP_C_RATE_DISCHARGE: { nStepMode = WORK_DRATE; } break; case PM_STEP_CCCV_CHARGE: // carefully! { nStepMode = WORK_CCCV; } break; case PM_STEP_CCCV_DISCHARGE: // carefully! { nStepMode = WORK_DCDV; } break; case PM_CONST_VOLT_CHARGE: { nStepMode = WORK_CV; } break; case PM_CONST_VOLT_DISCHARGE: // support lmtPara from V7206 { nStepMode = WORK_DV; } break; case PM_STEP_RATE_CV_CHARGE: { nStepMode = WORK_CRATECV; } break; case PM_STEP_RATE_CV_DISCHARGE: { nStepMode = WORK_DRATEDV; } break; case PM_STEP_CPCV_CHARGE: { nStepMode = WORK_CPCV; } break; case PM_STEP_CPCV_DISCHARGE: { nStepMode = WORK_DPDV; } break; case PM_STEP_LOOP: { nStepMode = WORK_WHILE; } break; default: { // 无法识别的第三方工步号 return false; } break; }
05-29

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值