2015-10-09 5 views
0

Я реализую механизм отслеживания истории голых костей для своего приложения 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 немного выше кусок я застрял на. Как я могу получить связанную историческую модель для конкретной модели, которую я отслеживаю? Есть ли простой способ сохранить ссылку на него в каждом дочернем классе? Я хотел бы предотвратить дублирование кода, и я подумал, что это правильный путь, но я застрял в этом вопросе. Любая помощь будет оценена по достоинству.

+0

Не имею в виду чтобы отрицать вашу работу, но я использую этот пакет, который очень легко отслеживает историю изменений объекта модели django, пожалуйста, посмотрите. https://github.com/treyhunner/django-simple-history –

+0

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

ответ

1

Я думаю, что самый простой способ будет хранить значение в качестве атрибута класса:

class HistoricalFoo(models.Model): 
    ... 

class Foo(HistoryTrackedModel): 
    history_model = HistoricalFoo 
    .... 

class HistoryTrackedModel(models.Model): 
    def save(self): 
     ... 
     h = self.history_model(...) 

Альтернативой будет генерировать исторические названия модели программно:

class HistoryTrackedModel(models.Model): 
    def save(self): 
     ... 
     history_model = globals()["Historical" + self.__class__.__name__] 
     h = history_model(...)