2014-12-30 36 views
3

我正在使用比我預期的增長更多的django應用程序,現在需要歸檔一些數據,以免它減慢最終查詢速度。我的問題是,歸檔現有模型的最佳方法是什麼?以下是我迄今認爲:在Django中存檔模型數據

1 - 創建一個繼承的模型:

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

class ArchivedModel(OriginalModel): 
    pass 

2 - 創建post_save方法,所以每當東西保存到我的原始模型,將創建一個存檔實例,以及。

3 - 在我的原始模型上用芹菜創建一個清除任務,僅保留相關數據。

但我不確定如果模型繼承將按我期望的那樣工作。如果有人對此有任何意見,我將不勝感激。

+0

最好的解決方案取決於您的項目的具體細節。一旦我像接受的答案那樣做了。它在Django的觀點中把一大堆事情複雜化了。像試圖通過管理界面查找記錄一樣平庸:如果記錄已歸檔,那麼我必須在歸檔中搜索,如果沒有,那麼我在主表中搜索。哦,這是可以克服的,但是在ORM級別的這種分裂很快會蔓延到各處。隨着項目的成熟,我最終還是隻有一張桌子。像你提到的性能問題應該在數據庫層面解決。 – Louis

回答

3

在您的代碼數據中,ArchivedModel將保留在OriginalModel SQL表中。在SQL級別ArchivedModel將是一張表,其中單個id字段引用OriginalModel表。所以,如果你將在post_save信號對象添加到ArchivedModel他們將在OriginalModel被複制:-)

你需要從它創建abstract base class並同時繼承「真實」的模式:

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

class OriginalModel(AbstractModel): 
    pass 

class ArchivedModel(AbstractModel): 
    pass 

在這種情況下OriginalModelArchivedModel將具有不同的SQL表和相同的一組字段。