2011-11-01 51 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

相關問題