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

如何在指定条件下手动创建Django-reversion版本及禁用自动版本生成?

实现特定条件下创建对象版本及禁用自动版本

一、仅当status改为'submitted'时创建版本

假设你用的是Django生态中常用的django-reversion做版本控制,要实现这个需求,需要手动控制版本创建逻辑,而非依赖自动生成:

  1. 精准判断状态变更条件
    直接判断self.status == 'submitted'会有漏洞——如果对象本来就是submitted状态,再次保存时不该重复生成版本。所以要先获取对象修改前的原始状态:
import reversion
from django.db.models import Model

class MyModel(AbstractModel):
    number = models.CharField(max_length=255)
    status = models.CharField(max_length=32)

    def save(self, *args, **kwargs) -> bool:
        old_status = None
        # 仅针对已存在的对象,获取数据库中原始状态
        if self.pk:
            old_obj = MyModel.objects.get(pk=self.pk)
            old_status = old_obj.status

        # 仅当状态从非submitted变为submitted时,触发版本创建
        need_create_version = (old_status != 'submitted' and self.status == 'submitted')
        
        # 先执行父类save方法,确保对象已持久化到数据库
        save_result = super().save(*args, **kwargs)
        
        # 满足条件则手动创建版本
        if need_create_version:
            with reversion.create_revision():
                reversion.set_comment("Status updated to submitted")
                reversion.add_object(self)
        
        return save_result
  1. 核心逻辑说明
  • 必须先调用super().save(),版本需要关联已保存的数据库对象
  • 使用reversion.create_revision()上下文管理器是django-reversion的标准手动版本创建方式
  • 对比新旧状态,避免重复生成无效版本

二、禁止每次保存自动创建版本

django-reversion默认通过以下几种方式自动生成版本,对应关闭即可:

  • Admin后台场景:不要继承VersionAdmin,改用普通ModelAdmin,后台保存时就不会自动生成版本
  • 自动注册场景:删除代码中reversion.register(MyModel)这类自动注册逻辑,完全通过手动代码控制版本
  • 全局中间件场景:如果不想全局启用自动版本,移除INSTALLED_APPS中的reversion.middleware.RevisionMiddleware中间件

最稳妥的方式是完全禁用自动版本机制,只在需要的地方通过手动调用reversion.create_revision()生成版本,就像上面代码中实现的那样。

内容的提问来源于stack exchange,提问作者Igor Atsberger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:35:21