我想将 Django 用于具有旧数据库的客户端项目。如果可能的话,我希望能够使用 Django 管理界面。但是,数据库有带有多列主键的表,我看到 Django 不喜欢 - 管理界面抛出 MultipleObjectsReturned 异常。
这里有哪些选择?我可以添加新表,但我不能更改现有表,因为其他项目已经在向数据库添加数据。我已经看到其他提到代理键的问题,但似乎需要更改表。
编辑:有问题的数据库是 MySQL 数据库。
我想将 Django 用于具有旧数据库的客户端项目。如果可能的话,我希望能够使用 Django 管理界面。但是,数据库有带有多列主键的表,我看到 Django 不喜欢 - 管理界面抛出 MultipleObjectsReturned 异常。
这里有哪些选择?我可以添加新表,但我不能更改现有表,因为其他项目已经在向数据库添加数据。我已经看到其他提到代理键的问题,但似乎需要更改表。
编辑:有问题的数据库是 MySQL 数据库。
那么您正在谈论一个遗留的 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 键能够与索引一起使用。我不写更多示例,因为我不知道您的数据库品牌是什么。
更多信息: