Я хочу создать отчет о всей истории обновлений моей ведущей модели в django

У меня есть модель 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 + подробности о том, кто внес изменения, когда и т.д. Лучше не использовать внешние ключи, вместо этого используйте идентификаторы. Если запись редактировалась 2 раза, таблица History имеет 2 записи для соответствующего идентификатора тренинга.

Training_LeadHist(id, training_lead_id, learning_partner_id, course_name , created_dt, updated_dt, ...)

Для сохранения данных в новой таблице History можно использовать сигналы Django. Создайте файл (скажем) signals.py в приложении.

Pre_save (django.db.models.signals.pre_save) вызывается до вызова метода сохранения модели save(), Таким образом, следующая функция будет вызвана непосредственно перед сохранением/обновлением последних данных в Training_Lead. refer. Там вы получаете существующий объект и сохраняете его состояние в новой таблице истории.

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_Lead.objects.create(**hist)

И добавить/изменить функцию ready в app.py (где находился 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

Вернуться на верх