2012-12-11 39 views
4

我使用Django 1.5b1和南遷移和生活一般都很棒。我有一些架構更新創建我的數據庫,其中包括用戶表。然後我打開一個夾具ff.User(我自定義的用戶模型):如何正確加載Django南遷移中的燈具?

def forwards(self, orm): 
     from django.core.management import call_command 
     fixture_path = "/absolute/path/to/my/fixture/load_initial_users.json" 
     call_command("loaddata", fixture_path) 

所有已經工作的偉大,直到我已經下來遷移線增加了一個領域我ff.User模型,更進一步。我的夾具加載現在打破:

DatabaseError: Problem installing fixture 'C:\<redacted>create_users.json': 
Could not load ff.User(pk=1): (1054, "Unknown column 'timezone_id' in 'field list'") 

時區是我添加到我的用戶模型的字段(ForeignKey)。

ff.User與數據庫中的不同,所以Django ORM放棄了DB錯誤。不幸的是,我無法在我的燈具中指定我的模型爲orm['ff.User'],這似乎是南方的做事方式。

我應該如何正確加載燈具使用南,以便它們不會中斷一旦這些燈具的模型被修改?

+0

你能告訴我們你的遷移代碼嗎? – Tadeck

回答

-1

閱讀下面的兩個職位已經幫我想出了一個解決方案:

http://andrewingram.net/2012/dec/common-pitfalls-django-south/#be-careful-with-fixtures

http://news.ycombinator.com/item?id=4872596

具體來說,我改寫了我的數據遷移到使用來自'dumpscript'

我需要輸出修改生成的腳本有點與南方一起工作。而不是做

from ff.models import User 

我做

User = orm['ff.User'] 

操作就像我想它。此外,它具有不需要硬編碼ID的好處,就像燈具需要的一樣。

+2

你能告訴我們[內容的遷移腳本](http://stackoverflow.com/questions/13825216/how-to-load-fixtures-in-django-south-migrations-properly/13825953#comment19025909_13825216)?讓別人瞭解你面臨的問題會有幫助,所以他們可以解決類似的問題。目前這個問題可能不夠清楚,對有類似問題的人有幫助。 – Tadeck

-1

通常,南方處理使用forwards()backwards()函數的遷移。在你的情況,你應該:

  • 改變燈具包含正確的數據,或遷移,打破它(或相同的遷移中,但改變模式之前)
  • 進口燈具,

在第二種情況下,遷移增加(或者,在你的情況下,刪除)列之前,您應該執行,將明確同樣加載燈具這個遷移(docs):

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

我相信這是完成您所需要的最簡單的方法。另外,請確保您不會執行一些簡單的錯誤,例如在應用較早的遷移之前嘗試使用新結構導入數據。

+0

我使用加載夾具的確切方法,您描述。不幸的是,它打破了在遷移中不使用顯式模型的「南部」規則。燈具使用明確的'app.Model'而不是凍結的'orm ['app.Model']',這是我的問題的根源。我不會推薦在南部遷徙中使用夾具給任何人,因爲這肯定會引起問題。請參閱我的答案,瞭解如何使用替代方法解決此問題。 –

1

我建議您可能感興趣的太的解決方案:

https://stackoverflow.com/a/21631815/797941

基本上,這就是我加載我的燈具:

from south.v2 import DataMigration 
import json 

class Migration(DataMigration): 

    def forwards(self, orm): 
     json_data=open("path/to/your/fixture.json") 
     items = json.load(json_data) 
     for item in items: 
      # Be carefull, this lazy line won't resolve foreign keys 
      obj = orm[item["model"]](**item["fields"]) 
      obj.save() 

     json_data.close() 
0

這對我來說也是一件令人沮喪的事情。我的解決方案是製作一些輔助工具。通過對數據庫中的數據進行採樣來創建固定裝置,並將南遷移歷史記錄包含在固定裝置中。

還有一個工具可以將南移歷史記錄添加到現有的燈具。

第三個工具在此燈具被修改時檢查提交,加載燈具,然後檢出最近的提交併執行南遷移並將遷移的數據庫轉儲回燈具。這是在一個單獨的數據庫中完成的,所以你的默認數據庫不會被禁用。

前兩個可以被認爲是測試代碼,第三個被認爲是可用的alpha,但它們已經對我很有幫助。

很想從別人那裏得到一些反饋: [email protected]:JivanAmara/django_fixture_tools.git 目前,它僅支持使用Git作爲RCS項目。

0

我找到的最優雅的解決方案是here,其中您的應用程序模型的get_model函數被切換出來,而是從提供的orm提供模型。然後在施加夾具後將其退回。

from django.db import models 
from django.core.management import call_command 

def load_fixture(file_name, orm): 
    original_get_model = models.get_model 

    def get_model_southern_style(*args): 
     try: 
      return orm['.'.join(args)] 
     except: 
      return original_get_model(*args) 

    models.get_model = get_model_southern_style 
    call_command('loaddata', file_name) 
    models.get_model = original_get_model 

您與load_fixture('my_fixture.json', orm)從內部調用它轉發定義。

+0

順便說一句,源似乎是編輯的https://djangosnippets.org/snippets/2897/轉發 – ptim