Django : Локальное сохранение экземпляра модели
Используя сигналы, я пытаюсь отследить разницу между старым экземпляром объекта и новым экземпляром при сохранении модели.
Я попробовал это :
Но логически в методе model_post_init_handler это ссылка на объект, который хранится в __original_instance. Таким образом, instance.__original_instance.is_used и instance.is_used всегда будут одним и тем же.
Как я
могу сохранить "снимок" объекта, когда он инициирован, чтобы я мог отследить, что было отредактировано?UPDATE
Приведенный выше метод функционален. Но он непрактичен: внешние ключи не управляются и ими нужно управлять вручную. Поскольку я буду использовать этот приемник для многих моделей, он будет прихотлив. Кроме того, мне не нравится json.loads(json.dumps())
, который я использовал для преобразования OrderedDict
, возвращаемого сериализатором, в dict
.
@receiver(pre_save, sender=Document)
def model_pre_save_handler(sender, instance, **kwargs):
model_dict = json.loads(json.dumps(sender().__serialize__(Document.objects.get(pk=instance.id)).data))
model_dict['type'] = DocumentType.objects.get(pk=model_dict['type']['id'])
instance.__original_instance = sender(**model_dict)
django_model_tracker делает это за вас. Вы можете ознакомиться с ней по адресу https://pypi.org/project/django-model-tracker/ и посмотреть учебник по адресу https://dev.to/mkalioby/tracking-database-changes-4kal