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)
对于将来运行此操作的人 - 当您将serializer_class属性添加到@action继承自的视图的装饰器时viewsets.ViewSet时,它确实会默认给您一个 TyperError,正如OP提到的:
TypeError: InfoViewSet() received an invalid keyword 'serializer_class'\nRun Code Online (Sandbox Code Playgroud)\n\n要克服这个问题,只需将serializer_class = None其作为类变量添加到您的视图中即可。
编辑 OP 代码的示例:
\n\nclass 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)\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
666 次 |
| 最近记录: |