Django Rest Framework:在ViewSet中注册多个序列化器

Ed_*_*Ed_ 5 python django django-rest-framework

我正在尝试创建一个自定义API(不使用模型),但是它没有在架构中显示请求定义(因此,没有大张旗鼓地显示它)。我当前的代码是:

views.py

class InfoViewSet(viewsets.ViewSet):

    @list_route(methods=['POST'])
    def some_method(self, request):
       data = JSONParser().parse(request)
       serializer = GetInfoSerializer(data=data)
       serializer.is_valid(raise_exception=True)
       info = get_data_from_elsewhere(serializer.data)
       return Response(info)
Run Code Online (Sandbox Code Playgroud)

urls.py

router.register(r'^info', InfoViewSet, base_name='info')
Run Code Online (Sandbox Code Playgroud)

serializers.py

class InfoSomeMethodSerializer(serializers.Serializer):

  list_id = serializers.ListField(child=serializers.IntegerField())
  password = serializers.CharField()
Run Code Online (Sandbox Code Playgroud)

它显得有些招摇,但只是响应部分。如何注册发布参数?我也不确定我是否正确使用了DRF(我是新手),所以任何纠正都将不胜感激。

-

编辑:我尝试了Linovia建议的serializer_class参数,但是没有用,我得到了:

TypeError:InfoViewSet()收到无效的关键字“ serializer_class”

我尝试了覆盖get_serializer_class方法,但也没有用:

def get_serializer_class(self):
    if self.action == 'some_method':
        return InfoSomeMethodSerializer
Run Code Online (Sandbox Code Playgroud)

Ulm*_*Ulm 3

对于将来运行此操作的人 - 当您将serializer_class属性添加到@action继承自的视图的装饰器时viewsets.ViewSet时,它确实会默认给您一个 TyperError,正如OP提到的:

\n\n
TypeError: InfoViewSet() received an invalid keyword 'serializer_class'\n
Run Code Online (Sandbox Code Playgroud)\n\n

要克服这个问题,只需将serializer_class = None其作为类变量添加到您的视图中即可。

\n\n

编辑 OP 代码的示例:

\n\n
class InfoViewSet(viewsets.ViewSet):\n    # \xe2\x86\x93 ADD THIS!\n    serializer_class = None \n\n    # Now you can add serializer_class without geting a TypeError \xe2\x86\x93\n    @list_route(methods=['POST'], serializer_class=GetInfoSerializer)\n    def some_method(self, request):\n       data = JSONParser().parse(request)\n       serializer = GetInfoSerializer(data=data)\n       serializer.is_valid(raise_exception=True)\n       info = get_data_from_elsewhere(serializer.data)\n       return Response(info)\n
Run Code Online (Sandbox Code Playgroud)\n