视图集ViewSet
一 、视图集ViewSet
使用视图集ViewSet
,可以将一系列逻辑相关的动作放到一个类中:
list()
提供一组数据retrieve()
提供单个数据create()
创建数据update()
保存数据destory()
删除数据
ViewSet
视图集类不再实现get()
、post()
等方法,而是实现动作 action 如 list()
、create()
等。
视图集只在使用as_view()
方法的时候,才会将action动作与具体请求方式对应上。如:
class BookInfoViewSet(viewsets.ViewSet):
def list(self, request):
books = BookInfo.objects.all()
serializer = BookInfoSerializer(books, many=True)
return Response(serializer.data)
def retrieve(self, request, pk=None):
try:
books = BookInfo.objects.get(id=pk)
except BookInfo.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
serializer = BookInfoSerializer(books)
return Response(serializer.data)
在设置路由时,我们可以如下操作
urlpatterns = [
url(r'^books/$', BookInfoViewSet.as_view({'get':'list'}),
url(r'^books/(?P<pk>\d+)/$', BookInfoViewSet.as_view({'get': 'retrieve'})
]
二 、常用视图集父类
2.1 ViewSet
继承自APIView
与ViewSetMixin
,作用也与APIView
基本类似,提供了身份认证、权限校验、流量管理等。
ViewSet
主要通过继承ViewSetMixin
来实现在调用as_view()
时传入字典(如{’get’:’list’}
)的映射处理工作。
在ViewSet
中,没有提供任何动作action
方法,需要我们自己实现action
方法。
2.2GenericViewSet
使用ViewSet
通常并不方便,因为list
、retrieve
、create
、update
、destory
等方法都需要自己编写,而这些方法与前面讲过的Mixin
扩展类提供的方法同名,所以我们可以通过继承Mixin
扩展类来复用这些方法而无需自己编写。但是Mixin
扩展类依赖与GenericAPIView
,所以还需要继承GenericAPIView
。
GenericViewSet
就帮助我们完成了这样的继承工作,继承自GenericAPIView
与ViewSetMixin
,在实现了调用as_view()
时传入字典(如{'get':'list'}
)的映射处理工作的同时,还提供了GenericAPIView
提供的基础方法,可以直接搭配Mixin
扩展类使用。
举例:
from rest_framework.viewsets import GenericViewSet
from rest_framework.mixins import ListModelMixin,CreateModelMixin,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin
class Student4ViewSet(GenericViewSet,ListModelMixin,CreateModelMixin,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin):
queryset = Student.objects.all()
serializer_class = StudentModelSerializer
url
的定义
urlpatterns = [
path("students7/", views.Student4ViewSet.as_view({"get": "list", "post": "create"})),
re_path("students7/(?P<pk>\d+)/", views.Student4ViewSet.as_view({"get": "retrieve","put":"update","delete":"destroy"})),
]
2.3 ModelViewSet
继承自GenericViewSet
,同时包括了ListModelMixin
、RetrieveModelMixin
、CreateModelMixin
、UpdateModelMixin
、DestoryModelMixin
。
2.4 ReadOnlyModelViewSet
继承自GenericViewSet
,同时包括了ListModelMixin
、RetrieveModelMixin
。
三 、视图集中定义附加action动作
在视图集中,除了上述默认的方法动作外,还可以添加自定义动作。
举例:
from rest_framework.viewsets import ModelViewSet,ReadOnlyModelViewSet
class StudentModelViewSet(ModelViewSet):
queryset = Student.objects.all()
serializer_class = StudentModelSerializer
def login(self,request):
"""学生登录功能"""
return Response({"message":"登录成功"})
url
的定义
urlpatterns = [
path("students8/", views.StudentModelViewSet.as_view({"get": "list", "post": "create"})),
re_path("students8/(?P<pk>\d+)/",
views.StudentModelViewSet.as_view({"get": "retrieve", "put": "update", "delete": "destroy"})),
path("stu/login/",views.StudentModelViewSet.as_view({"get":"login"}))
]
四 、action属性
在视图集中,我们可以通过action
对象属性来获取当前请求视图集时的action
动作是哪个。
例如:
from rest_framework.viewsets import ModelViewSet
from students.models import Student
from .serializers import StudentModelSerializer
from rest_framework.response import Response
class StudentModelViewSet(ModelViewSet):
queryset = Student.objects.all()
serializer_class = StudentModelSerializer
def get_new_5(self,request):
"""获取最近添加的5个学生信息"""
# 操作数据库
print(self.action) # 获取本次请求的视图方法名
通过路由访问到当前方法中.可以看到本次的action就是请求的方法名