Как я могу задним числом сделать автозапчасти, которые не нарушают django-admin - PullRequest
0 голосов
/ 18 июля 2010

Я создал модели в приложении Django, используя manage.py inspectdb в существующей базе данных postgres.Казалось, это работает, за исключением того, что все первичные ключи были описаны в моделях как IntegerField s, что делало их редактируемыми в панели администратора, и их нужно было вводить вручную, основываясь на знании идентификатора предыдущей записи.Я только что узнал об этом после некоторого использования клиентом, поэтому я вернулся, чтобы изменить такие вещи, как

blog_id = models.IntegerField(primary_key=True)

... на ...

blog_id = models.AutoField(primary_key=True)

Теперь поля идентификатора donне отображаются в панели администратора (хорошо), но добавление новых строк стало невозможным (не хорошо).

IntegrityError в / admin / franklins_app / blog / add /

duplicateзначение ключа нарушает уникальное ограничение "blog_pkey"

Что за исправление?(Дополнительный вопрос: возможно ли зафиксировать значение, которое Django пытается назначить в качестве первичного ключа для новой строки?)

1 Ответ

0 голосов
/ 18 июля 2010

Последовательность за последовательным полем, которым является ваш первичный ключ, не знает о введенных вручную записях.

Найдите максимальное значение первичного ключа:

SELECT MAX(<primary_key>) FROM <your_table>;

Затем установитеследующее значение базовой последовательности к числу, большему чем это:

SELECT SETVAL('<primary_key_seq>', <max_value_in_primary_key_plus_something_for_safety>);

Вы найдете имя последовательности (упомянутое выше как <primary_key_seq>), используя:

SELECT pg_get_serial_sequence('<your_table_name>', '<primary_key_column_name');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...