rest framework框架--视图

视图

GenericAPIView

# 路由
re_path(r'^(?P<version>[v1|v2]+)/api1/$', views.API1View.as_view(), name='api1')

# 视图
from rest_framework.generics import GenericAPIView
class API1View(GenericAPIView):
    queryset = models.Role.objects.all()
    serializer_class = RolesSerializers
    pagination_class = MyPageNumberPagination

    def get(self, request, *args, **kwargs):
        # 获取数据
        roles = self.get_queryset()  # 等价于models.Role.objects.all()
        # 分页
        pager_ser = self.paginate_queryset(roles)
        # 序列化
        ser = self.get_serializer(instance=pager_ser, many=True)
        return Response(ser.data)

和继承了APIView的写法来说,没有什么优点可以说,一般没有什么用处。

GenericViewSet

继承class GenericViewSet(ViewSetMixin, generics.GenericAPIView):,有事会先找左侧的类ViewSetMinin

# 路由
re_path(r'^(?P<version>[v1|v2]+)/api1/$', views.API1View.as_view({'get': 'list'}), name='api1')

# 视图
from rest_framework.viewsets import GenericViewSet
class API1View(GenericViewSet):
    queryset = models.Role.objects.all()
    serializer_class = RolesSerializers
    pagination_class = MyPageNumberPagination

    def list(self, request, *args, **kwargs):
        # 获取数据
        roles = self.get_queryset()  # 等价于models.Role.objects.all()
        # 分页
        pager_ser = self.paginate_queryset(roles)
        # 序列化
        ser = self.get_serializer(instance=pager_ser, many=True)
        return Response(ser.data)

此时,不在根据request.method的不同来执行不同的方法了,而是在as_view()中传递参数来指定请求方法和类中方法的对应关系。as_view({'get': 'list'})表示get方法执行API1View中的list方法。

Mixin系列

这个系列帮我们完成了增删改查功能,我们只需要继承就可以了

# 路由
re_path(r'^(?P<version>[v1|v2]+)/api1/$', views.API1View.as_view({'get': 'list'}), name='api1')

# 视图
from rest_framework.viewsets import GenericViewSet
from rest_framework.mixins import ListModelMixin
class API1View(ListModelMixin, GenericViewSet):
    queryset = models.Role.objects.all()
    serializer_class = RolesSerializers
    pagination_class = MyPageNumberPagination

在这里插入图片描述

ModelViewSet

集大成者,其继承了class ModelViewSet(mixins.CreateModelMixin, mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, mixins.ListModelMixin, GenericViewSet):

只需要很简单的几行代码就实现了增删改查,其中ListModelMixinCreateModelMixin是不需要传递id,其他的都需要传递id,所以对url是有要求的,必须传递pk的值。

# 路由
re_path(r'^(?P<version>[v1|v2]+)/api1/$', views.API1View.as_view({'get': 'list', 'post': 'create'}), name='api1'),
re_path(r'^(?P<version>[v1|v2]+)/api1/(?P<pk>\d+)$', views.API1View.as_view({'get': 'retrieve', 'delete': 'destroy', 'put': 'update', 'patch': 'partial_update'}), name='api1')

# 视图
from rest_framework.viewsets import ModelViewSet
class API1View(ModelViewSet):
    queryset = models.Role.objects.all()
    serializer_class = RolesSerializers
    pagination_class = MyPageNumberPagination

总结

  • 只想用基本的增删改查,用ModelViewSet
  • 只想用增删,用CreateModelMixin,DestroyModelMixin,GenericViewSet
  • 要完成复杂的逻辑,用GenericViewSet或APIView
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值