2

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

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

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

4

1 回答 1

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 键能够与索引一起使用。我不写更多示例,因为我不知道您的数据库品牌是什么。

更多信息:

Django 模型是否支持多列主键?

票 373

替代方法

于 2011-11-02T21:48:48.523 回答