我想在 django 中创建我的主要模型的所有更新历史记录的报告

问题描述 投票:0回答:1

我有一个

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']
django django-models django-rest-framework django-views django-forms
1个回答
1
投票

新建一个模型来保存历史数据,这个表有所有历史记录。 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 包

© www.soinside.com 2019 - 2024. All rights reserved.