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

Posted

技术标签:

【中文标题】Django Rest Framework:在 ViewSet 中注册多个序列化程序【英文标题】:Django Rest Framework: Register multiple serializers in ViewSet 【发布时间】:2017-07-21 01:49:27 【问题描述】:

我正在尝试创建一个自定义 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)

urls.py

router.register(r'^info', InfoViewSet, base_name='info')

序列化器.py

class InfoSomeMethodSerializer(serializers.Serializer):

  list_id = serializers.ListField(child=serializers.IntegerField())
  password = serializers.CharField()

它以招摇的方式出现,但只是响应部分。如何注册帖子参数?我也不确定我是否正确使用了 DRF(我是新手),因此我们将不胜感激。

--

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

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

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

def get_serializer_class(self):
    if self.action == 'some_method':
        return InfoSomeMethodSerializer

【问题讨论】:

self.action in ['list', 'retrieve']。据我所知,您不能直接提供some_method。此处答案中的示例。 ***.com/questions/22616973/… 【参考方案1】:

对于将来运行此程序的人-当您将serializer_class 属性添加到从viewsets.ViewSet 继承的视图的@action 装饰器时,默认情况下它确实会给您一个TyperError,如OP 所述:

TypeError: InfoViewSet() received an invalid keyword 'serializer_class'

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

OPs 代码编辑示例:

class InfoViewSet(viewsets.ViewSet):
    # ↓ ADD THIS!
    serializer_class = None 

    # Now you can add serializer_class without geting a TypeError ↓
    @list_route(methods=['POST'], serializer_class=GetInfoSerializer)
    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)

【讨论】:

以上是关于Django Rest Framework:在 ViewSet 中注册多个序列化程序的主要内容,如果未能解决你的问题,请参考以下文章

Django中rest_framework的认证组件,权限组件,频率组件,序列化组件的最简化版接口

如何在 django-rest-framework 中为 API 使用 TokenAuthentication

在 django-rest-framework 中插入 django-allauth 作为端点

django使用rest_framework

Django rest framework 身份和权限验证

Django Rest Framework