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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:35:34