Django如何延迟提交数据库变更,实现商品编辑待审核时保留原上线版本
电商商品编辑审核(不影响线上版本)实现方案
核心逻辑
你现有逻辑的问题是直接修改了主商品记录的审核状态,导致线上版本下架。正确的解法是完全隔离修改草稿和线上正式商品数据,审核通过前所有修改都存在独立的草稿表,不碰主表的任何数据,自然不会影响线上版本的展示。
具体实现步骤
- 新增
ProductEditDraft模型,字段设计参考(以Django ORM为例,其他框架逻辑一致):class ProductEditDraft(models.Model): STATUS_CHOICES = ( ('pending', '待审核'), ('approved', '审核通过'), ('rejected', '审核拒绝'), ) # 关联原正式商品 product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='edit_drafts') # 存储用户修改的字段键值对,键为Product表的字段名,值为修改后的内容 edited_fields = models.JSONField(verbose_name="修改的字段内容") submit_user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='submitted_product_edits') status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending') submit_time = models.DateTimeField(auto_now_add=True) audit_user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name='audited_product_edits') audit_time = models.DateTimeField(null=True, blank=True) reject_reason = models.TextField(blank=True, verbose_name="拒绝原因") - 调整商品编辑提交逻辑
用户提交商品编辑请求后,不再直接更新Product表记录,而是将用户修改的所有字段提取为键值对,存入ProductEditDraft表生成待审核草稿,原Product记录的isApproved字段保持原有值,线上展示完全不受影响。 - 开发审核对比界面
管理员后台的待审核列表中,针对每一条草稿,可以拉取关联的原Product记录的当前值,和草稿的edited_fields内容做字段级的差异对比,高亮标注修改内容,不需要管理员手动找不同。 - 审核结果处理
- 审核通过:遍历
edited_fields的键值对,逐个更新关联Product记录的对应字段,保存后将草稿状态更新为approved即可 - 审核拒绝:将草稿状态更新为
rejected,可填写拒绝原因通知提交用户,全程不修改Product主表数据
- 审核通过:遍历
- 兼容现有逻辑
原有前端商品查询、展示逻辑完全不需要修改,只要继续取Product表中isApproved=True的记录即可,草稿表数据不会流入前台展示流程。
可选优化
- 如果需要支持商品版本回溯,可以在每次审核通过更新主表时,生成一条
ProductHistory快照记录,存储更新前的全量字段值,后续需要回滚时直接读取快照恢复即可 - 商品图片、视频等静态资源修改时,可以先上传到临时存储目录,审核通过后再移动到正式存储路径,避免无效资源占用正式存储
- 如果你的
Product表字段非常多,且需要经常按修改的字段查询草稿,可以将ProductEditDraft表设计为和Product表字段完全一致,不需要用JSON存储修改内容,后续同步数据时可以直接字段赋值。
内容的提问来源于stack exchange,提问作者Damiisdandy
相关产品推荐
相关产品推荐

