我正在尝试创建一个自定义 API(不使用模型),但它没有在架构中显示请求定义(因此,没有在 swagger 中显示它)。我目前的代码是:
View .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)
网址.py
router.register(r'^info', InfoViewSet, base_name='info')
序列化程序.py
class InfoSomeMethodSerializer(serializers.Serializer):
list_id = serializers.ListField(child=serializers.IntegerField())
password = serializers.CharField()
它看起来很招摇,但只是响应部分。如何注册post参数?我也不确定我是否正确使用了 DRF(我是新手),所以任何更正都将不胜感激。
——
编辑:
我尝试了 Linovia 建议的 serializer_class 参数但没有用,我得到:
TypeError: InfoViewSet() received an invalid keyword 'serializer_class'
我尝试覆盖
get_serializer_class
方法并且也不起作用:def get_serializer_class(self):
if self.action == 'some_method':
return InfoSomeMethodSerializer
最佳答案
对于 future 运行此功能的人 - 当您添加 serializer_class
时归因于 @action
继承自 viewsets.ViewSet
的 View 的装饰器,它确实会默认给你一个 TyperError,正如 OP 提到的:
TypeError: InfoViewSet() received an invalid keyword 'serializer_class'
要克服这个问题,只需添加
serializer_class = None
作为您 View 的类变量。编辑 OP 代码示例:
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)
关于python - Django Rest 框架 : Register multiple serializers in ViewSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42536737/