Создание записи истории в Django для каждого UPDATE экземпляра класса

У меня есть модель в Django, которая используется для создания товара на складе

class Item(models.Model):
  user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
  description = models.ForeignKey(Item, on_delete=models.CASCADE, related_name='item')
  amount = models.IntegerField(default=0, blank=False)
  place = models.ForeignKey(Place, on_delete=models.CASCADE, related_name='place')
  issue_amount = models.IntegerField(default=0, blank=True)
  receive_amount = models.IntegerField(default=0, blank=True)

Сумма товара будет обновляться каждый раз при выдаче товара путем добавления или вычитания суммы выдачи или получения в функции представления, которая изменяет сумму экземпляра и вызывает сохранение для этого экземпляра.

Я хочу иметь возможность вести учет каждого обновления и сделать эту информацию доступной как для моего фронтенда, так и для модели администратора.

Я нашел этот учебник, в котором автор создает отдельную модель с теми же значениями полей, что и Item, а затем пишет SQL-команды непосредственно в базу данных, чтобы создать TRIGGER, который сохраняет каждое поле Item при каждом обновлении: https://www.youtube.com/watch?v=d26DUXynf8s

Есть ли способ воспроизвести такое же поведение с помощью Django?

Можете ли вы быть более точными. У вас есть модель под названием Items. В ней вы можете создать объект с некоторыми полями и значениями и хранить их в вашей базе данных, если хотите. Под обновлением вы подразумеваете каждый раз, когда вы создаете объект и сохраняете его?

Вам нужна библиотека журнала аудита.

Есть несколько (я никогда не был полностью удовлетворен ни одним из них), но мне вполне нравится этот .

Как вы можете видеть в документации, вы регистрируете свою модель для аудита следующим образом...

from django.db import models

from auditlog.registry import auditlog

class MyModel(models.Model):
    pass # Model definition goes here as usual.

auditlog.register(MyModel) # Register the model.

... и затем вы можете получить доступ к журналу для конкретной строки через новое свойство history.

log = MyModel.objects.first().history.latest()

Вы можете просмотреть различные другие варианты журнала аудита Django здесь, и все они являются более или менее вариациями на одну и ту же тему.

Django уже имеет именно такую возможность, которую вы ищете, с помощью модели LogEntry. Все, что вам нужно сделать, это прочитать данные из базы данных.

django.contrib.admin.LogEntry

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