Как разрешить круговую ссылку в модели Django? - PullRequest
0 голосов
/ 08 июня 2011

Я конвертирую старое приложение из ASP.NET + MSSQL в Django + Postgres. Существующий дизайн выглядит так:

create table foo 
( id  integer
, name varchar(20)
, current_status_id integer null
)

create table foo_status
( id integer
, foo_id integer
, status_date datetime
, status_description varchar(100)
)

Таким образом, у каждого foo есть несколько записей foo_history, но есть денормализованное поле current_status_id, которое указывает на последнюю запись истории.

Чтобы преобразовать данные, я просто определил foo.current_status_id как IntegerField, а не как ForeignKey, потому что Postgres будет (правильно) проверять пропущенные внешние ключи независимо от того, какую таблицу я загрузил первой.

Теперь, когда я преобразовал данные, я хотел бы снова получить все преимущества внешнего ключа для таких вещей, как запросы. Есть ли хороший способ справиться с этим, кроме изменения модели с IntegerField до того, как я сделаю syncdb для ForeignKey впоследствии?

1 Ответ

0 голосов
/ 13 июня 2011

Несколько замечаний о том, как работает django:

  • ./manage.py syncdb не изменяет существующие таблицы. Вы можете изменить поля модели и запустить syncdb, но ваша база данных останется нетронутой. Если вам нужна эта функция, используйте south .

  • При создании нового экземпляра x с полем myfk ForeignKey и установке его x.myfk_id, присваивая ему целое число и x.save() его, ограничение проверяется только на БД level: Django не сгенерирует исключение, если указанные записи отсутствуют. Таким образом, вы можете сначала создать таблицы без ограничений (либо используя IntegerFields + syncdb, как вы предлагали, либо тщательно запустив модифицированную .manage.py sqlall версию версии ForeignKeys), загрузить свои данные, а затем ALTER TABLE свою базу данных вручную.

...