2014-04-29 71 views
2

所以問題是我有一個Django項目現在運行良好。Django South Schema移植夾具預加載

我需要做兩個模式的變化,A和B.

出於某種原因,我需要在我申請遷移到一些固定加載到數據庫,然後應用遷移B.

我可以做它當然是手動的。像:

./manage.py migrate my_app 0001 
./manage.py loaddata my_fixture.json 
./manage.py migrate my_app 0002 

而且工作正常。

但是,在生產中,我想用腳本自動部署我的項目。我不想在其中添加太多手動步驟。

我理想的解決方案是,我可以在模式更改後自動填充我的夾具(也許有一些特殊的選項參數)。

有沒有人有一個想法如何做到這一點? PS:我可能沒有給出我的問題的足夠信息。所以如果你認爲問題本身太模糊,留下評論,讓我看看我能做些什麼來使其更清楚。

更新: 我將Serafeim標記爲正確答案。羅伯特·恩達爾Jørgensgaard指出了一個很好的點,可以在下面的帖子 django loading data from fixture after backward migration/loaddata is using model schema not database schema

不過來解釋詳細,我們的問題是不完全一樣的。我的模式A是創建一個新表,並且在可預見的將來不會改變它。遷移B是添加一個新的列到另一個表指向由A創建的表。這就是爲什麼我需要預先填充新表中的一些數據(對於其他一些複雜的原因,我不想解釋這一點太多了)。我已經從Serafeim測試瞭解決方案,它的工作原理。然而,如果任何人遇到類似的情況,請查看RobertJørgensgaardEngdahl分享的文章,瞭解此解決方案的不足之處,然後再採取該解決方案。再次感謝兩位答案提供者!

回答

0

您應該使用向南遷移數據:

http://south.readthedocs.org/en/latest/tutorial/part3.html#data-migrations

South已經有一個收件人在http://south.readthedocs.org/en/latest/fixtures.html中加載您的數據。

創建遷移0001後,創建一個將用於與加載數據的空白遷移:

 
./manage.py datamigration appname load_myfixture 

然後,0002_load_myfixture.py遷移模塊在修改forwards遷移這樣的:

 
def forwards(self, orm): 
    from django.core.management import call_command 
    call_command("loaddata", "my_fixture.json") 

您不需要執行backwards遷移。

+0

聽起來很有希望,讓我試試 –

+0

不會工作。看看這個相關的帖子:http://stackoverflow.com/questions/5472925/django-loading-data-from-fixture-after-backward-migration-loaddata-is-using-mo?rq=1 loaddata命令,不管你如何調用它,都會使用Django ORM而不是南ORM,所以後面的遷移將會使這個失效。 –

+0

@RobertJørgensgaardEngdahl,謝謝你的建議。我想我明白這個解決方案的有害部分。我仍然有使用它的原因,請參閱更新。 –

0

在任何遷移中引入新行應該被認爲是有害的:無法「重置」遷移;即發佈沒有ORM更改的版本,但是所有遷移均替換爲0001_initial遷移。在長期存在的項目中,您希望保持此選項打開。