serializer_action_class 在 DRF 的模型视图集中不工作

serializer_action_class not working in modelviewset in DRF

我正在尝试使序列化程序 class 动态化,但它不起作用。我有一个默认的序列化器 class,作为动态序列化器 class 用于不同的操作。这是我的模型视图集。

我的看法:

class ClassView(viewsets.ModelViewSet):
    queryset = Class.objects.all()
    serializer_class = ClassSerializer
    serializer_action_classes = {
        'put': AddStudentstoClassSerializer,
    }

    def get_serializer_class(self):

        """
            returns a serializer class based on the http method
        """
        try:
            return self.serializer_action_classes[self.action]
        except (KeyError, AttributeError):
            print("iam ClassSerializer")
            return super(ClassView, self).get_serializer_class()

我的函数在上面同一个模型视图集中

    @action(detail=True, methods=['put'])
    def add_remove_students(self, request, *args, **kwargs):
      ................

我的url如下:

urlpatterns = [
    path("class/<int:pk>/<slug:slug>/",views.ClassView.as_view({"put": "add_remove_students"}),
    ),
]

在上面的代码片段中,我尝试在 add_remove_students 函数中获取 AddStudentstoClassSerializer,但它不起作用。我们可以看到 print("iam ClassSerializer") 代码正在运行,但是我想要什么或 AddStudentstoClassSerializer.

首先,您的 serializer_action_classes 字典应该如下所示:

serializer_action_classes = {
    'add_remove_students': AddStudentstoClassSerializer,
}

因为self.action return 动作名称,而不是方法名称。你的意思是使用 self.request.method 属性,在这种情况下应该 return PUT..

但还有更好的方法来实现您的目标:

@action(detail=True, methods=['put'], serializer_class=AddStudentstoClassSerializer)
    def add_remove_students(self, request, *args, **kwargs):

action 装饰器可以自己使用 serializer_class。