美文网首页
使用混合(mixins)和泛型(generics)

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

作者: SingleDiego | 来源:发表于2018-04-16 11:25 被阅读98次

    使用基于类视图的最大优势之一是它可以轻松地创建可复用的行为。在 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)

          本文链接:https://www.haomeiwen.com/subject/vwuskftx.html