使用混合(mixins)和泛型(generics)

使用基于类视图的最大优势之一是它可以轻松地创建可复用的行为。在 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 来构建了我们的视图,并且用上了 ListModelMixinCreateModelMixin

基类提供核心功能,而 mixin 类提供 .list().create() 操作。然后我们将 getpost 方法绑定到适当的操作。

接下来编写每个 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

你可能感兴趣的:(使用混合(mixins)和泛型(generics))