Django Rest Framework之视图
一:编写视图的三种方式
- mixin类编写视图
- 基于类的视图
- ModelViewSet的视图
二:mixin类编写视图
路由设计:
re_path(r'^authors/$', views.AuthorViewSet.as_view()),
re_path(r'^authors/(?P<pk>\d+)/$', views.AuthorDetailView.as_view()),
# 不加pk会报错
# AssertionError: Expected view AuthorDetailView to be called with a URL keyword argument named "pk". Fix your URL conf, or set the `.lookup_field` attribute on the view correctly.
视图类:
# Author表
from rest_framework import mixins
from rest_framework import generics
class AuthorViewSet(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
queryset = Author.objects.all()
serializer_class = AuthorModelSerializers
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
class AuthorDetailView(mixins.UpdateModelMixin, mixins.RetrieveModelMixin, mixins.DestroyModelMixin, generics.GenericAPIView):
queryset = Author.objects.all()
serializer_class = AuthorModelSerializers
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
三:基于类的视图
路由设计:
re_path(r'^authors/$', views.AuthorViewSet.as_view()),
re_path(r'^authors/(?P<pk>\d+)/$', views.AuthorDetailView.as_view()),
视图类:
from rest_framework import generics
class AuthorViewSet(generics.ListCreateAPIView):
queryset = Author.objects.all()
serializer_class = AuthorModelSerializers
class AuthorDetailView(generics.RetrieveUpdateDestroyAPIView):
queryset = Author.objects.all()
serializer_class = AuthorModelSerializers
四:ModelViewSet的视图
路由设计:
五种访问方式放在同一个视图函数中,通过字典分发给不同的执行方法。
re_path(r'^authors/$', views.AuthorModelView.as_view({"get": "list", "post": "create"}), name="author"),
re_path(r'^authors/(?P<pk>\d+)/$', views.AuthorModelView.as_view({"get":"retrieve","put":"update","delete":"destroy"}),name="detailauthor")
视图类:
from rest_framework import viewsets
class AuthorModelView(viewsets.ModelViewSet):
queryset = Author.objects.all()
serializer_class = AuthorModelSerializers