Django 2.0.2中Serializer is_valid()返回False问题求助
排查MySerializer is_valid()返回False的问题
先别慌,咱们一步步拆解问题。首先要做的就是拿到序列化器验证失败的具体原因——当is_valid()返回False时,序列化器的errors属性会明确告诉你哪里出了问题,你可以在代码里临时加一行打印(或者用日志记录):
serializer = MySerializer(data=request.data.dict()) if not serializer.is_valid(): print(serializer.errors) # 直接看控制台输出的错误详情
结合你给出的输入示例{'SessionId': '222a282...'},我几乎可以确定核心问题出在这里:
核心原因:序列化器字段默认强制必填
你的MySerializer里定义了三个CharField:UserUID、DeviceUID、SessionId,而Django REST Framework的字段默认required=True——这意味着三个字段必须全部出现在输入数据中,少一个都无法通过验证。你现在只传了SessionId,另外两个字段缺失,自然会验证失败。
针对性解决方案
根据你的业务需求,任选一种方案即可:
方案1:将非必填字段设为可选
如果UserUID和DeviceUID并不是每次请求都必须提交的,那就在定义字段时加上required=False参数:
from rest_framework import serializers class MySerializer(serializers.BaseSerializer): UserUID = serializers.CharField(required=False) DeviceUID = serializers.CharField(required=False) SessionId = serializers.CharField()
方案2:确保请求传入所有必填字段
如果业务逻辑要求这三个字段必须全部存在,那就要检查前端请求,确保UserUID和DeviceUID也被包含在请求数据里。
额外优化提示:关于request.data.dict()
DRF的request.data本身就是一个类字典的可序列化对象,完全不需要调用.dict()方法转换,直接传入序列化器即可:
serializer = MySerializer(data=request.data)
这不是导致验证失败的直接原因,但这样写更规范,还能避免QueryDict转dict时可能出现的多值处理问题。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

