2014-12-30 5 views
3

Я работаю с приложением django, которое росло больше, чем я ожидал, и теперь вам нужно архивировать некоторые данные, чтобы он не замедлял возможные запросы. Мой вопрос в том, что лучший способ архивирования существующей модели? Вот то, что я думал, что до сих пор:Архивирование данных модели в Django

1 - Создание унаследованные моделей:

class OriginalModel(models.Model): 
    ... 
    field = models.CharField(etc...) 
    ... 

class ArchivedModel(OriginalModel): 
    pass 

2 - Создать метод post_save так всякий раз, когда что-то сохраняется в мою оригинальную модель он будет создавать архивный экземпляр, а ,

3 - Создайте задачу очистки с сельдереем на моей оригинальной модели, чтобы сохранить только соответствующие данные.

Я не уверен, однако, если наследование модели будет работать, как я ожидаю. Если у кого-то есть какой-то вклад в это, я буду очень благодарен.

+0

Лучшее решение зависит от конкретных деталей вашего проекта. Как только я это сделал, как говорится в принятом ответе. Это осложнило множество вещей в взглядах Джанго. Что-то столь же банально, как попытка найти запись через интерфейс администратора: если запись архивирована, тогда мне нужно искать в архиве, если нет, то я ищу в главной таблице. О, это непреодолимо хорошо, но этот раскол на уровне ORM скоро ползет повсюду. В конечном итоге я вернулся к одной таблице, когда проект созрел. Проблемы производительности, такие как упоминаемые вами, должны быть решены на уровне БД. – Louis

ответ

3

В ваших данных кода от ArchivedModel останется OriginalModel Таблица SQL. На уровне SQL ArchivedModel будет таблица с одним id полем, ссылающимся на таблицу OriginalModel. Так что, если вы будете добавлять объекты ArchivedModel в post_save сигнале они будут продублированы в OriginalModel :-)

Вам нужно создать abstract base class и наследовать как «реальную» модель из нее:

class AbstractModel(models.Model): 
    ... 
    field = models.CharField(etc...) 
    ... 
    class Meta: 
     abstract = True 

class OriginalModel(AbstractModel): 
    pass 

class ArchivedModel(AbstractModel): 
    pass 

В этом случае OriginalModel и ArchivedModel будут иметь разные таблицы SQL с тем же набором полей.

Смежные вопросы