我正在将一个旧的应用程序从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更改模型之外,有没有一种方法可以处理这个问题?
答案 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
您的数据库手动。