self.action属性的使用场景

我们在实际开发过程中,有时需要根据不同的功能返回不同的序列化器

那么此时的self.action就派上用处了

演示的python代码如下:

from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from book_drf.serializer import BookSerializer
from books.models import BookInfo


class Books(ModelViewSet):
    queryset = BookInfo.objects.all()  # 指定当前类视图使用的查询集数据
    # 重写 get_serializer_class 下面的序列化可以去掉
    # serializer_class = BookSerializer  # 指定当前类视图使用的序列化器

    # self.action使用场景根据不同的方法使用不同的序列化器
    def get_serializer_class(self):
        if self.action == 'lastdata':
            return BookSerializer
        else:
            return BookSerializer

    # 有@action 可以自动生成匹配 lastdata的路由
    # 如果detail=True 就可以生成匹配pk值的路由
    @action(methods=['get'], detail=True)
    def lastdata(self, request, pk):
        print(self.action)
        # 调用的方式 /books_drf/6/lastdata/
        # 路由配置方法 url(r'^books_drf/(?P<pk>\d+)/lastdata/$', viewset_view.BookDRFView.as_view({'get': 'lastdata'})),
        book = self.get_object()  # 从查询集中获取指定的单一数据对象
        ser = self.get_serializer(book)
        return Response(ser.data)