2011-06-08 83 views
0

我正在將一箇舊的應用程序從ASP.NET + MSSQL轉換爲Django + Postgres。現有的設計是這樣的:如何解決Django模型中的循環引用?

create table foo 
(id integer 
, name varchar(20) 
, current_status_id integer null 
) 

create table foo_status 
(id integer 
, foo_id integer 
, status_date datetime 
, status_description varchar(100) 
) 

因此,每個富具有多foo_history記錄,但有一個非規範化的領域,current_status_id,這點最後的歷史記錄。

爲了轉換數據,我只是將foo.current_status_id定義爲一個IntegerField,而不是一個ForeignKey,因爲無論我首先加載哪個表,Postgres都會(正確)抱怨丟失的外鍵。

現在我已經轉換了數據,我想再次獲得所有外鍵優點,例如查詢。除了從IntegerField中更改模型之前,我在執行syncdb到ForeignKey之前是否有處理此問題的好方法?

回答

0

有關Django是如何工作的幾個要點:

  • ./manage.py syncdb不會修改現有的表。您可以修改模型字段並運行syncdb,但您的數據庫將保持不變。如果您需要確實需要此功能,請使用south

  • 當與myfkForeignKey場創建一個新的實例x,並設置它的x.myfk_id由它指定一個整數,x.save()荷蘭國際集團它,約束只檢查了分貝級別:Django將不會拋出一個異常,如果引用記錄丟失。因此,您可以首先創建沒有約束的表(可以按照您的建議使用IntegerFields + syncdb,或仔細運行修改的.manage.py sqlall版本的ForeignKeys版本),手動加載您的數據,然後加載ALTER TABLE您的數據庫。