我有一个
Training_Lead
模型,在我的团队中,我有 5-6 名成员,他们可以从那里编辑此线索。我想创建一个更新历史记录报告,说明谁是更新线索以及何时更新,因为我创建了两个列名称 last_modification
和 last_modification_time
,当有人更新线索时,它们会自动更新。
class Training_Lead(models.Model):
handel_by = models.ForeignKey(UserInstance, on_delete=models.PROTECT)
learning_partner = models.ForeignKey(
Learning_Partner, on_delete=models.PROTECT, blank=False, null=False)
assign_to_trainer = models.ForeignKey(
Trainer, on_delete=models.PROTECT, null=True, blank=True)
course_name = models.CharField(max_length=2000)
lead_type = models.CharField(max_length=2000)
time_zone = models.CharField(choices=(('IST', 'IST'), ('GMT', 'GMT'), ('BST', 'BST'), (
'CET', 'CET'), ('SAST', 'SAST'), ('EST', 'EST'), ('PST', 'PST'), ('MST', 'MST'), ('UTC', 'UTC')), max_length=40, blank=False, null=False)
getting_lead_date = models.DateTimeField(null=True, blank=True)
start_date = models.DateTimeField(null=True, blank=True)
end_date = models.DateTimeField(null=True, blank=True)
lead_status = models.CharField(choices=(('Initial', 'Initial'), ('In Progress', 'In Progress'), ('Follow Up', 'Follow Up'), (
'Cancelled', 'Cancelled'), ('Confirmed', 'Confirmed'), ('PO Received', 'PO Received')), max_length=40, blank=False, null=False)
lead_description = models.CharField(max_length=9000, blank=True, null=True)
last_modification = models.CharField(null=False, blank=False, max_length=500)
last_modification_time = models.DateTimeField(auto_now_add='True')
def __str__(self):
return str(self.assign_to_trainer)
class Meta:
ordering = ['start_date']
新建一个模型来保存历史数据,这个表有所有历史记录。 Training_LeadHist 可能具有 Training_Lead + 的所有列 谁进行了更改、何时进行更改的详细信息。最好不要使用外键,而应使用 id。如果一条记录被编辑 2 次,历史记录表将有 2 个对应训练 ID 的条目。
Training_LeadHist(id, training_lead_id, learning_partner_id, course_name , created_dt, updated_dt, ...)
您可以使用 Django 信号来保存新历史表中的数据。 在应用程序中创建一个文件(例如)signals.py。
在调用模型 save() 方法之前调用 Pre_save (django.db.models.signals.pre_save), 因此,在将最新数据保存/更新到 Training_Lead 之前将调用以下函数。 参考 在那里,您获取现有对象并将状态保存到新的历史表中。
from django.db.models.signals import pre_save
@receiver(pre_save, sender=Training_Lead)
def save_to_lead_hist(sender, instance, **kwargs):
previous_obj = Training_Lead.objects.get(pk=instance.id)
hist = {'training_lead_id':previous_obj.id, 'handel_by_id: previous_obj.handel_by.id, 'course_name': previous_obj.course_name, .... }
Training_LeadHist.objects.create(**hist)
并添加/修改app.py的ready函数(signals.py所在的位置)
Appname/app.py
class AppNameConfig(AppConfig):
def ready(self):
import app.signals # add this line
Appname/__init__.py
default_app_config = 'Appname.apps.AppNameConfig'
或检查 django 包