继承APIView
from rest_framework.views import APIView
class PageView(APIView):
def get(self,request):
#获取所有用户
users = User.objects.all()
#创建分页对象
pg = PageNumberPagination()
#获取分页数据
page_users = pg.paginate_queryset(queryset=users,request=request)
#序列化
ser = PageUserSerializer(instance=page_users,many=True)
#使用restframework提供的Response
return Response(ser.data)
继承GenericAPIView
GenericAPIView继承自APIView
和上面继承APIView流程上没有区别,只是将各个功能封装好
from rest_framework.generics import GenericAPIView
class Page1View(GenericAPIView):
queryset = User.objects.all()
serializer_class = PageUserSerializer
pagination_class = PageNumberPagination
def get(self,request):
#获取所有用户
users = self.get_queryset()
# 获取分页数据
page_users = self.paginate_queryset(users)
#序列化
ser = self.get_serializer(instance=page_users,many=True)
#使用restframework提供的Response
return Response(ser.data)
继承GenericViewSet
GenericViewSet继承关系:
class GenericViewSet(ViewSetMixin, generics.GenericAPIView)
ViewSetMixin
中也重新了as_view()
,优先执行,并且改变了路由的写法
路由定义:path('page2_view', Page2View.as_view({'get': 'list'})),
将get请求指定list()处理,其他没有变动,代码如下:
from rest_framework.viewsets import GenericViewSet
class Page2View(GenericViewSet):
queryset = User.objects.all()
serializer_class = PageUserSerializer
pagination_class = PageNumberPagination
def list(self,request):
#获取所有用户
users = self.get_queryset()
# 获取分页数据
page_users = self.paginate_queryset(users)
#序列化
ser = self.get_serializer(instance=page_users,many=True)
#使用restframework提供的Response
return Response(ser.data)
继承ListModelMixin
查看ListModelMixin源码,里面定义的list()源码其实跟上面自己写的一样
class ListModelMixin:
"""
List a queryset.
"""
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
路由定义:path('page3_view', Page3View.as_view({'get': 'list'})),
继承自ListModelMixin
和GenericViewSet
,功能更强大,业务代码更精简:
from rest_framework.mixins import ListModelMixin
class Page3View(ListModelMixin,GenericViewSet):
queryset = User.objects.all()
serializer_class = PageUserSerializer
pagination_class = PageNumberPagination
ListModelMixin
帮我们实现了get请求对应的list()方法,可以获取所有记录,如果要实现增加、删除、修改、查找单条记录怎么写?
继承ModelViewSet
ModelViewSet继承关系如下,可以实现增删改查
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):
业务代码实现如下,代码进一步精简,并且具备增删改查功能
from rest_framework.viewsets import ModelViewSet
class Page4View(ModelViewSet):
queryset = User.objects.all()
serializer_class = PageUserSerializer
pagination_class = PageNumberPagination
路由定义(一个url对应了两个路由):
path('page4_view', Page4View.as_view({'get': 'list','post':'create'})),
re_path('page4_view/(?P<pk>\d+)/', Page4View.as_view({'get': 'retrieve','delete':'destroy','put':'update','patch':'partial_update'})),#根据id 查找单个对象/删除/更新单个对象全部内容/局部更新
支持比如?form=json和.json方式请求
path('page4_view', Page4View.as_view({'get': 'list','post':'create'})),#http://localhost:8000/page4_view?format=json
re_path('page4_view\.(?P<format>\w+)', Page4View.as_view({'get': 'list','post':'create'})),#http://localhost:8000/page4_view.json
re_path('page4_view/(?P<pk>\d+)/', Page4View.as_view({'get': 'retrieve','delete':'destroy','put':'update','patch':'partial_update'})),#http://localhost:8000/page4_view/1/?format=json
re_path('page4_view/(?P<pk>\d+)\.(?P<format>\w+)/', Page4View.as_view({'get': 'retrieve','delete':'destroy','put':'update','patch':'partial_update'})),#http://localhost:8181/page4_view/1.json
restframework提供了更简单的方式,等同上面的4个url
from rest_framework import routers
router = routers.DefaultRouter()
router.register(r'xxx',Page4View)#http://localhost:8000/xxx?format=json,http://localhost:8000/xxx.json,http://localhost:8000/xxx/1/?format=json,http://localhost:8181/xxx/1.json
urlpatterns = [
...
path('', include(router.urls)),
]
总结
基本增删改查 使用ModelViewSet
复杂逻辑 使用APIView
或者GenericViewSet(路由中可以自定义请求方式对应的处理方法,示例中通过两条路由区分多条查询和单条查询)
网友评论