2009-10-02 105 views
2

我想以一種方式重構一些Django應用程序,包括將模型從一個應用程序移動到另一個可以更容易重用的模型。Django模型重構和遷移

許多這些模型具有與其他模型(如用戶)的ForeignKey關係或M2M關係。例如:

class Department(models.Model): 
    name = models.CharField(max_length=255) 
    reviewers = models.ManyToManyField(User) 

在大多數情況下,模型不會改變,所以我目前只是在新應用中重新定義了它們。當然,這會導致問題related_name,因爲我有兩個單獨的應用程序定義相同的模型,並manage.py syncdb提供了以下錯誤:

new_app.department: Accessor for m2m field 'reviewers' clashes with related m2m field 'User.department_set'. Add a related_name argument to the definition for 'reviewers'. 
old_app.department: Accessor for m2m field 'reviewers' clashes with related m2m field 'User.department_set'. Add a related_name argument to the definition for 'reviewers'. 

做這件事時,我還需要遷移數據保留任何自動生成數據庫IDS。我計劃使用的ORM做遷移,以爲像下面將工作:

from newapp.models import Department 
import oldapp.models as old 

for obj in old.Department.objects.all(): 
    new_obj = Department(id=obj.id, name=obj.name) 
    new_obj.save() 
    for r in obj.reviewers.all(): 
     new_obj.reviewers.add(r) 
    new_obj.save() 

當然,related_name問題不允許我這樣做。

其他人如何讓這類代碼重構和遷移成爲可能?謝謝!

+0

Re。您的評論:South做了數據遷移,請參閱http://south.aeracode.org/wiki/Tutorial3 – 2009-10-02 17:00:44

回答

6

你看過使用遷移工具,如Southdjango-evolution

+0

我知道南部,但認爲它只是修改表格模式(但不是數據)。它是否也傳輸數據? – 2009-10-02 16:14:48

+0

是的,South有一個非常好的數據遷移系統,包括「凍結」舊版本的模型,以便數據遷移在實際模型看起來不同之後甚至可以繼續工作。 – 2009-10-02 17:04:26

+0

閱讀了南方教程(以及更多)之後,我認爲這絕對是一條路。謝謝。 – 2009-10-02 18:48:58

0

只需在新模型或舊模型中爲ForeignKey提供related_name參數,就可以非常容易地解決即時問題,正如錯誤消息告訴您的那樣。沒有信心,這將解決您在此次遷移中遇到的所有問題,但會讓您向前邁進一步。

+0

我實際上有3個不同的應用程序的幾個(大概是10個)模型,我想把它們全部放到1個共享應用程序中......我想我可以爲舊模型設置臨時related_names,進行遷移,然後刪除舊模型。我假設這將允許我保持所有其他代碼不變。 – 2009-10-02 18:16:12

+0

是的,如果您將related_name添加到舊模型的ForeignKey,則不需要更改任何代碼。其他的東西會暫時中斷,因爲新表格中不會有任何數據,但你會很快修復。 – 2009-10-02 19:16:22