如何将Django与具有复合主键的旧只读数据库表一起使用?

时间:2011-11-01 14:44:44

标签: mysql database django composite-primary-key

我想将Django用于具有遗留数据库的客户端项目。如果可能的话,我希望能够使用Django管理界面。但是,数据库中有多列主键的表,我看到Django不喜欢 - 管理界面抛出MultipleObjectsReturned异常。

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

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

1 个答案:

答案 0 :(得分: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