Как использовать Django с устаревшими таблицами базы данных только для чтения с составными первичными ключами? - PullRequest
2 голосов
/ 01 ноября 2011

Я хочу использовать Django для клиентского проекта с устаревшей базой данных. Если это возможно, я бы хотел использовать интерфейс администратора Django. Однако в базе данных есть таблицы с многоколоночными первичными ключами, которые, как мне кажется, Django не нравится - интерфейс администратора выдает исключение MultipleObjectsReturned.

Какие варианты здесь? Я могу добавить новые таблицы, но не могу изменить существующие таблицы, так как другие проекты уже добавляют данные в базу данных. Я видел другие вопросы, в которых упоминались суррогатные ключи, но, похоже, для этого потребовалось бы изменить таблицы.

РЕДАКТИРОВАТЬ: рассматриваемая база данных является базой данных MySQL.

1 Ответ

3 голосов
/ 03 ноября 2011

Тогда вы говорите о устаревшей базе данных 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

Альтернативные методы

...