2013-07-31 61 views
2

我有一個django驅動的網站和一個EC2 postgresql服務器。該網站擁有不斷增長的社區和大量用戶提交的內容。在開發過程中,隨着新功能的發展,模型和視圖變得非常混亂。我想重新開始,重新編寫整個程序,並將一些模型和視圖分解爲模塊化應用程序。Django ORM - 重大數據庫更改/數據遷移

只是作爲一個例子,如果我想遷移來自:

content.models.py 

class Content(models.Model): 
    user = models.ForeignKey(User) 
    post = models.CharField(max_length=500) 
    photo = models.ImageField(upload_to='images/%Y/%m/%d') 

到:

content.models.py 

class Content(models.Model): 
    user = models.ForeignKey(User) 
    post = models.CharField(max_length=500) 

photo.models.py 

    photo = models.ImageField(upload_to='images/%Y/%m/%d') 
    content = models.ForeignKey(content.models.Content) 

什麼是去這不會丟失任何的最佳方式數據?

+0

你目前使用南? –

+0

是的,我一直在使用南方。 – bcoop713

回答

1

這種情況下,可以通過3向南遷移解決:

  1. [架構遷移]創建Photo
  2. [數據遷移]每個Content記錄創建Photo紀錄photocontent領域正確設置
  3. [模式遷移]刪除字段photoContent

更新:第2步

python manage.py datamigration <app_name> copy_photos_to_separate_model

一個新的文件將在<app_name>/migrations/####_copy_photos…

編輯該文件被創建。編輯forwardbackward方法。第一個是在向前移動時被調用,另一個在向後移動時被調用。

第一個從統一模型中創建單獨的照片。另一個則需要在當時選擇一張可能是很多照片的照片,然後將它擠回到Content模型中。

特殊的orm對象表示db在遷移時的狀態(儘管在那段時間裏models.py看起來像什麼樣 - 當對生產進行分析時,它將與在遷移時在測試/開發環境)。

def forward(self, orm): 
    Content = orm['<app_name>.Content'] 
    Photo = orm['<app_name>.Photo'] 
    for content in Content.objects.all(): 
     Photo.object.get_or_create(content=content, 
            defaults={'photo': content.photo}) 

根據表格的大小,您可以嘗試優化查詢的數量。

如果在db中每個單獨的內容已經有多個Photo記錄,它就會被炸掉,但它不應該是你的情況。

+0

步驟2會是什麼樣子?除了自動遷移外,我對South沒有做太多的工作 – bcoop713

+0

查看更新。 –