使用基于类视图的最大优势之一是它可以轻松地创建可复用的行为。在 mixin
类中,Django REST 框架为我们预先封装了:创建、获取、更新、删除等操作。
让我们来看看我们是如何通过使用 mixin
类编写视图的。这是我们的 apis.py
:
from rest_framework import mixins
from rest_framework import generics
from myApp.models import Book
from myApp.serializers import BookSerializer
class BookList(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
# 返回所有 book 对象并封装成 List
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
# 新建一个 book 对象
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
我们看下这里的具体实现方式。我们继承 GenericAPIView
来构建了我们的视图,并且用上了 ListModelMixin
和 CreateModelMixin
。
基类提供核心功能,而 mixin
类提供 .list()
和 .create()
操作。然后我们将 get
和 post
方法绑定到适当的操作。
接下来编写每个 book 对象的 API:
class BookDetail(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
generics.GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
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)
非常相似。这一次我们使用 GenericAPIView
类来提供核心功能,并添加 mixins
来提供 .retrieve()
,.update()
和 .destroy()
操作。
通过使用 mixin
类,我们使用更少的代码重写了这些视图,但我们还可以再进一步。REST 框架提供了一组已经混合好(mixed-in)的通用视图,我们可以进一步简化 apis.py
模块。
from rest_framework import mixins
from rest_framework import generics
from myApp.models import Book
from myApp.serializers import BookSerializer
class BookList(generics.ListCreateAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
class BookDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
网友评论