Django Rest Framework之视图

一:编写视图的三种方式

  1. mixin类编写视图
  2. 基于类的视图
  3. ModelViewSet的视图

Django rest framework

二: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
发布了45 篇原创文章 · 获赞 3 · 访问量 1517

猜你喜欢

转载自blog.csdn.net/pcn01/article/details/103961807