You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 09:30:52