Вставка данных в другую таблицу на post_save в обновленное поле модели Django

Я использую ModelForms для обновления данных. Мне нужно отследить, какой пользователь обновил поля в "MyModel", сохранив имя пользователя, имя поля и DateTime обновления в таблице UpdateFieldLog. Я узнал, что это можно сделать с помощью сигналов, но не знаю, как это сделать.

Может кто-нибудь помочь

Модель

class MyModel(models.Model):
    a = models.CharField(max_length=20, null=True)
    b = models.CharField(max_length=25, null=True)
    c = models.CharField(max_length=10, null=True)
    d = models.CharField(max_length=20, null=True)
    e = models.BigIntegerField(null=True)
    f = models.CharField(max_length=15, null=True)
    g = models.DateField(null=True)

class UpdateFieldLog(models.Model):
    field_name = models.CharField(max_length=20, null=False)
    updated_by = models.ForeignKey(User, on_delete=models.DO_NOTHING)
    updated_on = models.DateTimeField(auto_now_add=True)

@receiver(post_save, sender=MyModel)
def post_save_MyModel(sender, instance, **kwargs):
    if not instance._state.adding:
        for item in iter(kwargs.get('update_fields')):
            if item == 'field_name' and instance.field_name == "some_value":
                print(item)
                print(instance.field_name)
    else:
        print ('this is an insert')

Вы можете достичь этого с помощью представлений.

Для создания:

if my_model_form.is_valid(): 
    my_model = my_model_form.save(commit=False)
    track_update = TrackUpdate.objects.create(created_by=request.user)
    my_model.save()

Для обновления:

track_update = TrackUpdate.objects.get(id=1)

if my_model_form.is_valid():
    my_model = my_model_form.save(commit=False)
    track_update.updated_by = request.user
    track_update.save()
    my_model.save()

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