Django中Training_Lead模型更新历史报告生成需求
问题分析与解决方案
你当前的实现仅能记录最后一次修改的用户和时间,无法生成完整的更新历史报告。要实现全量更新记录的需求,需要调整模型设计,新增历史记录表来追踪每一次修改操作。
一、修正现有字段的问题
先修复Training_Lead模型里两个字段的错误:
last_modification用CharField存储用户信息不够严谨,应直接关联用户模型;last_modification_time的auto_now_add='True'仅在创建数据时设置时间,更新时不会自动刷新,需改为auto_now=True。
修正后的Training_Lead模型片段:
class Training_Lead(models.Model): # 其他原有字段保持不变... # 替换原有last_modification和last_modification_time字段 last_modified_by = models.ForeignKey(UserInstance, on_delete=models.PROTECT, related_name='modified_leads') last_modified_time = models.DateTimeField(auto_now=True) def __str__(self): return str(self.assign_to_trainer) class Meta: ordering = ['start_date']
二、新增更新历史记录表
创建单独模型存储每一次修改的历史信息,包含关联线索、修改人、修改时间,还可可选记录修改的字段与内容:
from django.db.models import JSONField class TrainingLeadHistory(models.Model): training_lead = models.ForeignKey(Training_Lead, on_delete=models.CASCADE, related_name='history_records') modified_by = models.ForeignKey(UserInstance, on_delete=models.PROTECT) modified_time = models.DateTimeField(auto_now_add=True) # 可选:用JSON字段记录修改前后的字段变化,方便查看详情 changes = JSONField(null=True, blank=True) def __str__(self): return f"{self.training_lead} - 修改于 {self.modified_time} by {self.modified_by}" class Meta: ordering = ['-modified_time']
三、用Django信号自动记录历史
使用post_save信号,在每次Training_Lead保存时(含创建和更新)自动生成历史记录,可通过created参数区分创建与更新操作:
from django.db.models.signals import post_save from django.dispatch import receiver @receiver(post_save, sender=Training_Lead) def save_training_lead_history(sender, instance, created, **kwargs): # 仅记录更新操作的历史,创建操作可按需选择是否记录 if not created: TrainingLeadHistory.objects.create( training_lead=instance, modified_by=instance.last_modified_by, # 可选:添加字段差异对比逻辑,将修改内容存入changes字段 # changes=get_changed_fields(instance) )
四、生成更新历史报告
通过反向关联即可获取某个线索的完整更新历史:
# 获取指定线索的历史记录 lead = Training_Lead.objects.get(id=1) history_records = lead.history_records.all() # 输出报告示例 for record in history_records: print(f"修改人: {record.modified_by}, 修改时间: {record.modified_time}") # 若有changes字段,可打印具体修改内容 # if record.changes: # print(f"修改内容: {record.changes}")
额外提示
- 若需要精准追踪字段变化,可在信号中对比实例修改前后的字段值,将差异存入
changes字段; - 若不想手动实现,也可使用
django-simple-history这类第三方库自动生成历史记录,但自定义实现更灵活可控。
内容的提问来源于stack exchange,提问作者Sharandeep Singh
相关产品推荐
相关产品推荐

