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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 12:20:35