Django AutoField не возвращает новый ключ primary_key - PullRequest
2 голосов
/ 21 июля 2011

У нас небольшая проблема с проектом Django, над которым мы работаем, и нашей базой данных postgresql.

Проект, над которым мы работаем, - это преобразование site / db из PHP-сайта в django.сайт.Таким образом, мы использовали inspect db для генерации моделей из текущего бэкэнда PHP.

Это дало нам это, и мы добавили primary_key и уникальный равный True:

class Company(models.Model):
     companyid = models.IntegerField(primary_key=True,unique=True)
     ...
     ...

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

class Company(models.Model):
     companyid = models.AutoField(primary_key=True)
     ...
     ...

Это прекрасно сохраняет запись о компании, но проблема в том, что мы делаем

result = form.save()

Мы не можем сделать

result.pk or result.companyid

, чтобы получить новый первичный ключ в базе данных (однако мы можем видеть, что ему был присвоен правильный идентификатор компании в базе данных.

Мы находимся впотеря для того, что происходит. Любые идеи или ответы будут с благодарностью, спасибо!

1 Ответ

4 голосов
/ 09 сентября 2011

Я столкнулся с тем же самым, но во время обновления проекта с большой историей в django. Какая боль ...

В любом случае, проблема, похоже, связана с тем, что бэкэнд django postgresql получает первичный ключ для вновь созданного объекта: он использует pg_get_serial_sequence для разрешения последовательности для первичного ключа таблицы. В моем случае столбец id был создан не с типом serial, а с integer, что означает, что моя последовательность неправильно подключена к table.column.

Следующее основано на таблице с оператором create, вам придется корректировать имена таблиц, столбцы и имена последовательностей в соответствии с вашей ситуацией:

CREATE TABLE "mike_test" (
  "id" integer NOT NULL PRIMARY KEY,
  "somefield" varchar(30) NOT NULL UNIQUE
);

Решение, если вы используете postgresql 8.3 или новее, довольно простое:

ALTER SEQUENCE mike_test_id_seq OWNED BY mike_test.id;

Однако, если вы используете 8.1, все немного мрачнее. Я воссоздал свою колонку в следующем (простейшем) случае:

ALTER TABLE mike_test ADD COLUMN temp_id serial NOT NULL;
UPDATE mike_test SET temp_id = id;
ALTER TABLE mike_test DROP COLUMN id;
ALTER TABLE mike_test ADD COLUMN id serial NOT NULL PRIMARY KEY;
UPDATE mike_test SET id = temp_id;
ALTER TABLE mike_test DROP COLUMN temp_id;
SELECT setval('mike_test_id_seq', (SELECT MAX(id) FROM mike_test));

Если ваш столбец связан с какими-либо другими ограничениями, вам будет еще веселее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...