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