【问题标题】:serializer_action_class not working in modelviewset in DRFserializer_action_class 在 DRF 的模型视图集中不起作用
【发布时间】:2021-12-12 03:33:53
【问题描述】:

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

我的看法:

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):
      ................

我的网址如下:

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

在上面的代码 sn-p 中,我尝试在 add_remove_students 函数中获取 AddStudentstoClassSerializer,但它不起作用。我们可以看到 print("iam ClassSerializer") 代码正在工作,但是我想要的是 AddStudentstoClassSerializer。

【问题讨论】:

    标签: django api url serialization django-rest-framework


    【解决方案1】:

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

    serializer_action_classes = {
        'add_remove_students': AddStudentstoClassSerializer,
    }
    

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

    但是有更好的方法来实现你的目标:

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

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

    【讨论】:

    • 你好monio,谢谢你的回答,即如果我使用serializer_action_classes = { 'add_remove_students': AddStudentstoClassSerializer,我不需要在函数之前使用@action装饰器? }
    • 我猜你还是需要使用它。 @action 装饰器定义了详细的 urls/actions,没有它,这个函数应该是无用的。但是你可以试试……无论如何你都应该通过 DRF 路由器注册视图。
    • 是的,即使我移除了装饰器,它也能正常工作,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多