Django REST Framework序列化器断言错误求助
排查AssertionError: ".validate() should return the validated data"问题
核心原因
这个错误是Django REST Framework(DRF)序列化器的validate()方法未返回验证后的字典数据导致的——当你在序列化器中重写validate()方法,但遗漏返回验证后的data时就会触发该报错。
排查及修复步骤
- 检查自定义序列化器的
validate()方法:- 确认方法末尾存在
return data语句,示例正确写法:def validate(self, data): # 自定义验证逻辑 if data.get('status') == 0 and data.get('expire_time') is None: raise serializers.ValidationError("禁用状态必须设置过期时间") return data # 必须返回验证后的data - 如果继承了BaseModel/SoftDeleteModel对应的父类序列化器,需确保正确调用父类方法并返回结果:
def validate(self, data): # 先执行父类的验证逻辑 data = super().validate(data) # 再添加自定义验证 if data.get('deleted'): raise serializers.ValidationError("已软删除的实例不允许修改") return data
- 确认方法末尾存在
- 检查验证逻辑的分支完整性:避免出现某些分支只抛出异常、其他分支未返回
data,或误写return None的情况。 - 确认视图绑定的序列化器:检查PUT/POST请求使用的序列化器是否为你修改后的版本,排除混用未正确实现
validate方法的序列化器的可能。 - 排查SoftDeleteModel相关序列化器:如果软删除逻辑在序列化器中重写了
validate,确保没有遗漏返回语句。
错误示例及修复
错误写法(遗漏return):
class YourModelSerializer(serializers.ModelSerializer): def validate(self, data): if data.get('deleted_at') is not None: raise serializers.ValidationError("已删除数据无法编辑") # 此处无return语句,触发AssertionError
修复后写法:
class YourModelSerializer(serializers.ModelSerializer): def validate(self, data): if data.get('deleted_at') is not None: raise serializers.ValidationError("已删除数据无法编辑") return data # 添加返回验证后的数据
内容的提问来源于stack exchange,提问作者user20181423
相关产品推荐
相关产品推荐

