如何在指定条件下手动创建Django-reversion版本及禁用自动版本生成?
实现特定条件下创建对象版本及禁用自动版本
一、仅当status改为'submitted'时创建版本
假设你用的是Django生态中常用的django-reversion做版本控制,要实现这个需求,需要手动控制版本创建逻辑,而非依赖自动生成:
- 精准判断状态变更条件
直接判断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
- 核心逻辑说明
- 必须先调用
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
相关产品推荐
相关产品推荐

