如何解决Django模型中的循环引用?

时间:2011-06-08 13:31:30

标签: django-models

我正在将一个旧的应用程序从ASP.NET + MSSQL转换为Django + Postgres。现有设计如下所示:

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都有多个foo_history记录,但是有一个非规范化字段current_status_id,它指向最后一条历史记录。

要转换数据,我只是将foo.current_status_id定义为IntegerField,而不是外键,因为无论我先加载哪个表,Postgres都会(正确地)抱怨缺少外键。

现在我已经转换了数据,我希望再次获得所有外键的好处,例如查询。除了在我之后使用syncdb到ForeignKey之前从IntegerField更改模型之外,有没有一种方法可以处理这个问题?

1 个答案:

答案 0 :(得分:0)

关于django如何运作的几点:

  • ./manage.py syncdb不会修改现有表格。您可以修改模型字段并运行syncdb,但您的数据库将保持不变。如果您需要确实需要此功能,请使用south

  • 使用x myfk字段创建新实例ForeignKey时,通过为其分配一个整数和x.myfk_id来设置x.save()它,仅在数据库级别上检查约束:如果缺少引用的记录,Django将不会抛出异常。因此,您可以首先创建没有约束的表(通过使用您建议的IntegerFields + syncdb,或者仔细运行ForeignKeys版本的修改后的.manage.py sqlall版本),加载数据,然后ALTER TABLE您的数据库手动。