Class-based Views
https://www.django-rest-framework.org/tutorial/3-class-based-views/
APIView 继承于 django view类
提供了 http method 方法的抽象, 即继承于此类的应用类中, 可以定义 get post 等方法, 来处理对应的http方法请求。
获取全部实例 和 创建实例。
from snippets.models import Snippet from snippets.serializers import SnippetSerializer from django.http import Http404 from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status class SnippetList(APIView): """ List all snippets, or create a new snippet. """ def get(self, request, format=None): snippets = Snippet.objects.all() serializer = SnippetSerializer(snippets, many=True) return Response(serializer.data) def post(self, request, format=None): serializer = SnippetSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
对单个实例 修改 获取 和 删除。
class SnippetDetail(APIView): """ Retrieve, update or delete a snippet instance. """ def get_object(self, pk): try: return Snippet.objects.get(pk=pk) except Snippet.DoesNotExist: raise Http404 def get(self, request, pk, format=None): snippet = self.get_object(pk) serializer = SnippetSerializer(snippet) return Response(serializer.data) def put(self, request, pk, format=None): snippet = self.get_object(pk) serializer = SnippetSerializer(snippet, data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) def delete(self, request, pk, format=None): snippet = self.get_object(pk) snippet.delete() return Response(status=status.HTTP_204_NO_CONTENT)
将定义的业务类, 调用其 as_view 转换为 普通的django view处理函数(接受一个参数 request实例, 函数中返回 reponse实例)
from django.urls import path from rest_framework.urlpatterns import format_suffix_patterns from snippets import views urlpatterns = [ path('snippets/', views.SnippetList.as_view()), path('snippets/<int:pk>/', views.SnippetDetail.as_view()), ] urlpatterns = format_suffix_patterns(urlpatterns)
Using mixins
对于更加普适的模型处理逻辑, 应该有更加普适的view模式类来处理, 不用业务编写者来实现 get post函数的业务逻辑。
restframework提供了 GenericAPIView , 此类继承于 APIView
封装了 get post等通用的模型处理方法,
继承此类的业务类,指定queryset 和 serializer类, 然后在 get post方法中调用 MIXIN 类封装好的业务逻辑函数。
获取全部实例 和 创建单个实例。
from snippets.models import Snippet from snippets.serializers import SnippetSerializer from rest_framework import mixins from rest_framework import generics class SnippetList(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView): queryset = Snippet.objects.all() serializer_class = SnippetSerializer 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 SnippetDetail(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, generics.GenericAPIView): queryset = Snippet.objects.all() serializer_class = SnippetSerializer 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)
Using generic class-based views
如果get post函数中没有定制化的逻辑, 则使用 具体的业务APIView 则更加合适。
这样 get post函数的定义也可以省略了。
from snippets.models import Snippet from snippets.serializers import SnippetSerializer from rest_framework import generics class SnippetList(generics.ListCreateAPIView): queryset = Snippet.objects.all() serializer_class = SnippetSerializer class SnippetDetail(generics.RetrieveUpdateDestroyAPIView): queryset = Snippet.objects.all() serializer_class = SnippetSerializer
GenericAPIView
https://www.django-rest-framework.org/api-guide/generic-views/#genericapiview
This class extends REST framework's
APIView
class, adding commonly required behavior for standard list and detail views.Each of the concrete generic views provided is built by combining
GenericAPIView
, with one or more mixin classes.
Mixins
https://www.django-rest-framework.org/api-guide/generic-views/#mixins
The mixin classes provide the actions that are used to provide the basic view behavior. Note that the mixin classes provide action methods rather than defining the handler methods, such as
.get()
and.post()
, directly. This allows for more flexible composition of behavior.The mixin classes can be imported from
rest_framework.mixins
Concrete View Classes
https://www.django-rest-framework.org/api-guide/generic-views/#concrete-view-classes
The following classes are the concrete generic views. If you're using generic views this is normally the level you'll be working at unless you need heavily customized behavior.
The view classes can be imported from
rest_framework.generics
.
http://blogs.thebitx.com/index.php/2021/09/29/django-rest-framework-views-generic-views/
继承图
http://blogs.thebitx.com/index.php/2021/09/29/django-rest-framework-views-generic-views/
https://www.cnblogs.com/shijieli/p/10273610.html