Serializer返回amount为None但request.data数据正确的问题求助
问题:Serializer返回amount为None,但request.data中值正确
我希望从Serializer中获取amount数据,但Serializer返回了None;不过从request.data中却能获取到正确的amount值,请求协助解决。
终端输出内容
System check identified no issues (0 silenced). August 23, 2022 - 16:19:21 Starting development server at http://127.0.0.1:8000/ Quit the server with CTRL-BREAK. {'amount': 1000000} {'amount': None} Internal Server Error: /api/zarinpal/request/ Traceback (most recent
视图函数代码
@api_view(['GET', 'POST']) @permission_classes([IsAuthenticated]) def request_to_pay(request): data = request.data print(data) serializer = RequestToPaySerializer(data=data) serializer.is_valid(raise_exception=True) print(serializer.data)
Serializer类定义
class RequestToPaySerializer(serializers.Serializer): amount = serializers.DecimalField(max_digits=20, decimal_places=3) description = serializers.CharField(required=False)
解决方案
核心问题
你用错了获取验证后数据的属性:在反序列化场景(将请求数据转为Python对象)下,serializer.data是用来序列化输出的工具属性,验证后的输入数据要从serializer.validated_data中获取。
修复步骤
把视图中的print(serializer.data)改为:
print(serializer.validated_data)
补充说明
DecimalField支持解析整数、字符串形式的数字,所以request.data中的1000000(整数类型)可以被正确验证并转换为Decimal类型,存储在validated_data中。- 如果后续需要将数据序列化输出(比如返回响应),再使用
serializer.data,它会把Decimal类型转换为符合格式的数值(比如带指定小数位的字符串或数字)。
内容的提问来源于stack exchange,提问作者Sasan Mahmoodi
相关产品推荐
相关产品推荐

