Я реализую механизм отслеживания истории голых костей для своего приложения Django, в котором модели, которые я хочу отслеживать, переопределяют методыи delete()
. В каждом методе, я создаю свои объекты истории по мере необходимости:Сохранение ссылок на связанные модели в Django?
def save(self, *args, **kwargs):
super(MyModel, self).save(*args, **kwargs)
# Create the historical model based on what we were given
h = Historical_MyModel(**{field.attname: getattr(self, field.attname) for field in self._meta.fields})
# Set some other fields as necessary...
h.save()
Поскольку код для каждого save()
и delete()
метод похож, я полагал, что хороший способ предотвратить набрав тот же код, чтобы создать abstract base class иметь аналогичный код в одном месте. Одна вещь, с которой я борюсь, заключается в том, как обрабатывать создание экземпляра Historical_ {Model} для каждого дочернего класса (каждый Historical_ {Model} по существу является копией оригинальной модели с дополнительной информацией, например, изменение, когда произошли изменения и т. д.).
В моем базовом классе метод будет выглядеть примерно так, я думаю:
class HistoryTrackedModel(models.Model):
def save(self, *args, **kwargs):
super(self.model, self).save(*args, **kwargs)
# Create the historical model based on what we were given
h = SOME_HISTORICAL_MODEL_INSTANCE(**{field.attname: getattr(self, field.attname) for field in self._meta.fields})
# Other fields get set ...
h.save()
class Meta:
abstract = True
SOME_HISTORICAL_MODEL_INSTANCE немного выше кусок я застрял на. Как я могу получить связанную историческую модель для конкретной модели, которую я отслеживаю? Есть ли простой способ сохранить ссылку на него в каждом дочернем классе? Я хотел бы предотвратить дублирование кода, и я подумал, что это правильный путь, но я застрял в этом вопросе. Любая помощь будет оценена по достоинству.
Не имею в виду чтобы отрицать вашу работу, но я использую этот пакет, который очень легко отслеживает историю изменений объекта модели django, пожалуйста, посмотрите. https://github.com/treyhunner/django-simple-history –
Я начал использовать этот пакет, но у моего приложения есть некоторые причуды, с которыми я не могу работать. Таким образом, я решил, что прокручу свой простой механизм. Я почти там, но для этого одного блокпоста. –