2011-11-30 73 views
0

我正在与这两个(示范)车型Django项目数据库并将租户与公寓而不是建筑联系起来。因此,我现在计划迁移到以下三种模式:ForeignKey的关系和迁移在Django

Tenant: id, Aparment(ForeignKey), User(ForeignKey), NameOfTenant(CharacterField) 

Apartment: id, Building(ForeignKey), RoomNumber(Interger), Address(CharacterField) 

Building: id, DateWhenItWasBuild(Date) 

首先,我增加了单元模型/桌,并与来自建筑物表(地址和建筑物的外键)的信息来填充它。其次,我将公寓的外键字段添加到租户模型。

如果我现在要引用的租户表公寓ID的公寓(这反过来引用到大楼),我得到一个外键约束的例外:

(1452, 'Cannot add or update a child row: a foreign key constraint fails 
(`database`.`tenant_tenant`, CONSTRAINT `apartment_id_refs_id_5dfbfc78bb68defd` 
FOREIGN KEY (`apartment_id`) REFERENCES `property_apartment` (`id`))') 

我不太清楚为什么会发生这种情况,但我怀疑它可能导致以下问题: Tentant拥有建筑外键和公寓外键。然而,公寓也有建筑的外键。

在接下来的步骤中,我会在租户中添加参考到公寓,然后删除对建筑物的参考。这里的问题是,我不能先删除建筑物参考,然后添加公寓参考,因为我会失去住房建筑/公寓的信息。

有没有人有一个想法,如果这是问题,还是我错过了完全不同的东西?

回答

1

第一种方法:

您可以创建树表和在迁移完成rename tables到原来的名字:

Create table new_building (id, DateWhenItWasBuild(Date)); 
insert into new_building (id, DateWhenItWasBuil) 
select (id, DateWhenItWasBuil) from building; 

Create table Apartment (id, Building(ForeignKey), 
RoomNumber(Interger), Address(CharacterField) ; 

insert into Apartment (id, Building(ForeignKey), 
RoomNumber(Interger), Address(CharacterField)) 
select id, id, NULL, Address from building; 

create table new_Tenant(id, Aparment(ForeignKey), 
User(ForeignKey), NameOfTenant(CharacterField)); 

insert into new_Tenant (id, Aparment, 
User, NameOfTenant) 
select id, building, user, nameofTenant) 

然后删除旧表,并重新命名新闻:

DROP TABEL Tenant; 
DROP TABLE building; 
RENAME TABLE new_Tenant TO Tenant 
    , new_building TO building; 

我认为在这一点上apparmentId是buildingId。但是你可以从另一个表中取这个值。

请记住,手动创建表不是强制性的。您可以在元重命名表的名称,并执行syncdb创建表:

class Tenant(models.Model):  
    # ... 
    class Meta: 
     db_Table = 'new_tenant' 

另外,还可以用滴出删除外键字段外键约束。

[ALTER TABLE tenant_tenant DROP FOREIGN KEY apartment_id_refs_id_5dfbfc78bb68defd;][2] 

记住south可以帮助您在这个问题上。

+0

我试图找出为什么会发生这种情况,似乎上述关系问题不是原因。 – phoxley