Django.db.utils.IntegrityError: дублирующее значение ключа нарушает уникальное ограничение "django_content_type_pkey"

В чем-то проблема, я получаю сообщение об ошибке выше, когда я запускаю 'python manage.py syncdb. Я работаю на довольно старом сайте. Он запускает django 1.2.6 с помощью postgres DB.

Запуск не был установлен на юг, и мне удалось это сделать. Ran python manage.py schemamigration --initial contact_enquiries, который прошел отлично и попросил меня мигрировать. Затем я запустил python manage.py migrate contact_enquiries, затем получил ту же ошибку, что и выше.

Он не соглашается ни на какой синтаксис в моих моделях, поэтому я запутался. Вот мои модели и, надеюсь, это пролить свет.

from django.db import models

class DocumentUpload(models.Model):
    name = models.CharField(max_length="200")

    document_upload = models.FileField(upload_to="uploads/documents")


    def __unicode__(self):
        return "%s" % self.name

class DocumentRequest(models.Model):
    name = models.CharField(max_length="200")

    company = models.CharField(max_length="200")

    job_title = models.CharField(max_length="200")

    email = models.EmailField(max_length="200")

    report = models.ManyToManyField(DocumentUpload)

    def __unicode__(self):
        return "%s" % self.name

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

Спасибо!

Ответ 1

Хотя я не на 100% уверен, что это проблема, есть хорошая вероятность, что ваша последовательность устарела.

Выполняет ли это в Postgres решение проблемы?

SELECT setval('django_content_type_id_seq', (SELECT MAX(id) FROM django_content_type));

Ответ 2

Это обычно означает, что ваша первичная последовательность клавиш не синхронизирована. Это может быть вызвано плохой миграцией и т.д.

Чтобы исправить это,
1. Запустите dbshell
python manage.py dbshell
2. Найдите текущее максимальное значение первичного ключа
select max(id) from django_content_type;
3. Измените последовательность первичных ключей, чтобы теперь начать со значения, превышающего значение, найденное на шаге 2.
Таким образом, предполагая, что значение, возвращаемое на этапе 2, равно 290780, затем измените последовательность, чтобы начать с числа больше 290780
alter sequence django_content_type_id_seq restart with 295000;

Ответ 3

Я получил эту ошибку:

django.db.utils.IntegrityError: duplicate key value violates unique constraint 
    "blahmodule_blahthing_blahstuff_id"
DETAIL:  Key (blahstuff_id)=(1) already exists.

Возможное решение:

  • Попробуйте перенастройки blahstuff отношения в blahthing от OneToOneField поля к ForeignKey

Объяснение того, что я использовал:

Я использовал Django RestFramework, который был подключен через ListCreateAPIView, и ModelSerializer. По какой-то причине OneToOneField присоединяет UNIQUE к одной из таблиц соединения blahmodule_blahthing_blahstuff_id, (я на самом деле не уверен, является ли это таблицей соединения, это предположение), но независимо от того, происходит ли волшебство в переключении django на ForeignKey с возвратами QuerySet, решил мою проблему.

связанные с:

Насколько актуальный вопрос выше:

схема:

-- Table: public.django_content_type

-- DROP TABLE public.django_content_type;

CREATE TABLE public.django_content_type
(
    id integer NOT NULL DEFAULT nextval('django_content_type_id_seq'::regclass),
    app_label character varying(100) COLLATE pg_catalog."default" NOT NULL,
    model character varying(100) COLLATE pg_catalog."default" NOT NULL,
    CONSTRAINT django_content_type_pkey PRIMARY KEY (id),
    CONSTRAINT django_content_type_app_label_model_76bd3d3b_uniq UNIQUE (app_label, model)

)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

ALTER TABLE public.django_content_type
    OWNER to YOURUSER;

Пример строки:

pk    app_label                model

1   "your_app"           "your_app_model"
2   "your_app"           "your_app_model"
3   "blah_module"        "blahthing"
4   "blah_module"        "blahstuff"

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

Ответ 4

По вдохновению Вольфа вот мое решение.

SELECT setval('django_migrations_id_seq', (SELECT MAX(id) FROM django_migrations));