Django模型保存报错:ModelState类型无法JSON序列化
问题原因及解决方法
核心问题
你遇到的TypeError: Object of type ModelState is not JSON serializable错误,本质是**diff字典中包含了Django模型实例对象**,而非单纯的可序列化基础数据(字符串、数字、普通字典/列表等)。Django模型实例内部自带_state属性(即ModelState对象),默认JSON编码器无法处理这类特殊对象。
解决步骤
- 提取模型实例的具体字段值:不要直接将模型对象存入
diff,而是提取你需要的字段内容。比如之前如果写的是{'new_value': obj1, 'old_value': obj2},要改成{'new_value': obj1.your_field, 'old_value': obj2.your_field}。 - 用工具函数转模型为可序列化字典:使用Django内置的
model_to_dict函数,安全地将模型实例转为纯字典结构:from django.forms.models import model_to_dict # 假设obj1、obj2是需要对比的模型实例 new_value = model_to_dict(obj1, fields=['field1', 'field2']) # 指定需要的字段 old_value = model_to_dict(obj2, fields=['field1', 'field2']) diff = {'target_field': {'new_value': new_value, 'old_value': old_value}} - 检查diff生成逻辑:确认你用来生成
diff的对比函数,没有直接返回模型实例,只输出基础数据类型。
额外优化点
你的TransactionAudit模型中timestamp字段设置了auto_now_add=True,会在实例创建时自动填充当前时间,因此不需要在create时手动传入timestamp: timezone.now(),可以删除这个参数,避免冗余。
内容的提问来源于stack exchange,提问作者Mukul Anand
相关产品推荐
相关产品推荐

