2011-11-01 52 views
2

我想使用Django进行具有旧版数据库的客户端项目。如果可能,我希望能够使用Django管理界面。然而,数据库有多列主键的表,我看到Django不喜欢 - 管理界面抛出一个MultipleObjectsReturned异常。如何使用带有复合主键的遗留只读数据库表的Django?

这里有什么选择?我可以添加新表,但是我无法更改现有表,因为其他项目已经将数据添加到数据库。我看到其他提及代理键的问题,但似乎需要更改表。

编辑:有问题的数据库是MySQL数据库。

+0

看来,我可以使用一些Django的ORM的没有问题。仅使用工作部件是否存在任何潜在问题? – davidscolgan

回答

3

您正在讨论传统的READONLY数据库,也许您可​​以创建一个没有多列PK的外部模式(视图)。例如,您可以连接字段键。这里和示例:

例如:

表:

create table A (
    a1 int not null, 
    a2 int not null, 
    t1 varchar(100), 
    primary key (a1, a2) 
) 

create table B (
    b1 int not null, 
    b2 int not null, 
    a1 int not null, 
    a2 int not null, 
    t1 varchar(100), 
    primary key (b1, b2), 
    constraint b_2_a foreign key (a1,a2) 
    references A (a1, a2) 
) 

外部架构由Django的读取:

Create view vA as 
select 
    a1* 1000000 + a2 as a, A.* 
from A 

Create view vB as 
select 
    b1* 1000000 + b2 as b, 
    a1* 1000000 + a2 as a, B.* 
from B 

Django模型:

class A(models.Model): 
    a = models.IntegerField( primary_key=True) 
    a1 = ... 
    class Meta(CommonInfo.Meta): 
     db_table = 'vA'  

class B(models.Model): 
    b = models.IntegerField( primary_key=True) 
    b1 = ... 
    a = models.ForeignKey(A) 
    a1 = ... 
    class Meta(CommonInfo.Meta): 
     db_table = 'vB'  

你可以细化技术来使varchar键能够与索引一起工作。我不写更多的样本,因为我不知道你的数据库品牌是什么。

的更多信息:

Do Django models support multiple-column primary keys?

ticket 373

Alternative methods

相关问题