Создание записи истории в 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