Django-reversion:访问field_dict时出现版本数据不兼容问题
解决Django-reversion访问field_dict时的版本数据不兼容问题
我之前也踩过这个坑!这种错误通常和模型字段变更、版本序列化不匹配或者代码遗漏有关,咱们一步步排查解决:
1. 先补全你的修改代码
看你提供的脚本里f.size...没写完,这大概率会导致模型保存时字段状态异常,进而让reversion生成的版本数据有问题。先把修改部分补完整:
# 修改文件条目: with reversion.create_revision(): f.mtime = datetime.now() f.ctime = datetime.now() f.size = 66 # 补全字段赋值,根据你的需求设置合适的值 f.save() reversion.set_comment("Revision 2")
2. 确认模型已被reversion正确注册
如果你的File模型没被reversion注册,它无法正确序列化所有字段,版本数据自然会不兼容。在你的models.py或者项目初始化文件里添加注册代码:
import reversion from .models import File # 注册模型,让reversion追踪它的版本变化 reversion.register(File)
3. 处理模型字段变更导致的旧版本数据问题
如果你的File模型后来修改过字段(比如新增/删除/修改了字段类型),旧的Version记录里没有这些字段的数据,访问field_dict就会触发KeyError。解决方法有两种:
方法A:清理旧版本数据(测试环境适用)
如果是测试环境,直接删除所有旧版本记录,重新生成即可:
# 在Django shell里执行 from reversion.models import Version Version.objects.all().delete()
然后重新运行你的脚本,生成新的兼容版本数据。
方法B:更新旧版本数据(生产环境适用)
生产环境不能随便删数据,可以写个脚本重新生成所有对象的版本,让序列化数据匹配当前模型结构:
from django.db import transaction from xxx.models import File import reversion with transaction.atomic(): for file_obj in File.objects.all(): with reversion.create_revision(): # 重新保存对象,生成匹配当前模型的版本 file_obj.save() reversion.set_comment("Updated version to match current model schema")
4. 访问field_dict时做容错处理
如果不想修改旧版本数据,可以在访问field_dict时用get方法避免KeyError:
from reversion.models import Version # 获取对象的最新版本 latest_version = Version.objects.get_for_object(f).first() # 用get方法设置默认值,避免字段不存在时报错 size = latest_version.field_dict.get('size', 0) mtime = latest_version.field_dict.get('mtime', None)
5. 检查版本兼容性
确认你的Django版本和django-reversion版本匹配,比如:
- django-reversion 4.x 支持 Django 3.2+
- django-reversion 3.x 支持 Django 2.2-3.1
如果版本不匹配,也可能出现序列化格式不兼容的问题,建议升级/降级到兼容的版本。
内容的提问来源于stack exchange,提问作者OneRaynyDay
相关产品推荐
相关产品推荐

