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 に答える