总结:
a. 增删改查 ModelViewSet
b. 增删 CreateModelMixin, DestroyNodeMixin, GenericViewSet
c. 复杂逻辑 GenericViewSet 或 APIView
1. 使用ModelViewSet(主要是GenericAPIView在作用,而其他类在做路由映射)
1. 在视图中使用ModelViewSet(注意:queryset中是不一定是全部数据,可以是筛选后或者查询过滤后的数据)
这样只支持单个数据的删除,更新,一般也是这样,不会有批量更新和删除。批量的另写两个,一个更新的,一个删除的就行。
from .utils.serializers.pager import PageSerialiser
from rest_framework.response import Response
from rest_framework.pagination import PageNumberPagination
from rest_framework.viewsets import ModelViewSet
class MyPageNumberPagination(PageNumberPagination):
# 继承分页对象,有更多的灵活配置功能
# cursor_query_param = 'cursor' # 分页参数
page_size = 2 # 每一个页默认显示多少个
# ordering = 'id' # 按照哪个字段排序
page_size_query_param = 'size' # 可定制每一页显示多少个
max_page_size = 10 #一页最多显示多少个
class View1(ModelViewSet):
authentication_classes = []
permission_classes = []
queryset = models.Role.objects.all() # 获取所有数据,也可以是筛选或查询后的数据,然后进行增删改查操作
pagination_class = MyPageNumberPagination # 获取分页对象,这个是分页对象
serializer_class = PageSerialiser # 序列化,这个是导入的序列化对象
2. 要在urls中配置,
url('^api/v1/view1/$', views.View1.as_view({'get':'list', 'post':'create'}), name='view1'),
url('^api/v1/view1/(?P<pk>\d+)/$', views.View1.as_view({'get':'retrieve', 'delete':'destroy', 'put':'update', 'patch':'partial_update'}), name='view2')
list是获取数据,create是创建数据,所以无参数;retrieve是获取单个数据,destroy是删除某个数据,update是全部更新,partial_update是部分字段的更新
3. 这样可以获得对应方法的对应操作了
4. 上面urls对应的链接
下面urls对应的链接
2. GenericViewSet继承APIView,可以修改路由对应系统,其他的没变
from rest_framework.viewsets import GenericViewSet
如图所示,如果请求是gei,则执行list方法,如果请求时post,则执行xxx方法