2011-06-08 82 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您的数据库。