Ключ (extended_object_id) уже существует

5 января 2019 г. 14:28

При публикации страницы в django-cms (3.5.0) может возникнуть ошибка:

Exception Type: IntegrityError at /admin/cms/page/312/ru/publish/
Exception Value: ОШИБКА: повторяющееся значение ключа нарушает ограничение уникальности "spec_pageext_extended_object_id_key"
DETAIL: Ключ "(extended_object_id)=(324)" уже существует.

По-английски:

django.db.utils.IntegrityError: duplicate key value violates unique constraint "spec_pageext_extended_object_id_key"
DETAIL:  Key (extended_object_id)=(324) already exists.

Из трейсбека понятно, что ошибка связана с Extension (Расширение страницы).

Ещё нужно сказать, что ошибка не всегда проявляется при публикации страницы. Чтобы воспроизвести ошибку нужно:

  1. Создать расширение (или по-другому "Сохранить" из Меню / Страница / Моё расширение)
  2. Опубликовать страницу
  3. Перейти на черновую версию, щёлкнув "Изменить"
  4. Удалить расширение (Перейдя в Меню / Страница / Моё расширение и щёлкнув "Удалить")
  5. Снова создать расширение (Меню / Страница / Моё расширение)
  6. И попытаться опубликовать страницу.

На шестом шаге появляется ошибка.

Оказывается при публикации не стирается старый объект Extension и возникает исключение уникальности ключа. Поэтому я написал Mixin, который перед выполнением операций по публикации Extension удалаяет старое Extension со страницы:

class ExtensionFixMixin(object):
    def copy_to_public(self, public_object, language):
        if not self.public_extension:
            try:
                self.__class__.objects.get(extended_object_id=public_object.pk).delete()
            except self.__class__.DoesNotExist:
                pass

        return super(ExtensionFixMixin, self).copy_to_public(public_object, language)

Теперь можно использовать в своих расширениях:

class MyExtension(ExtensionFixMixin, PageExtension):
    ...

Оказывается, есть тикет на гитхабе пакета django-cms , где встречается эта ошибка. Я дополнил тикет своим комментарием. Мое решение - это обходной путь. Как именно в самой django-cms поправить я сильно не смотрел. Надеюсь, разработчики поправят это дело.

Оцените статью

0 из 5 (всего 0 оценок)

captcha
Отмеченные звёздочкой поля ( * ) являются обязательными для заполнения.

Спасибо за ваш отзыв!

После нажатия кнопки "Отправить" ваше сообщение будет доставлено мне на почту.

Автор статьи

Артём Мальцев

Веб-разработчик, владеющий знаниями языка программирования Python, фреймворка Django, системы управления содержимым сайта Django CMS, платформы для создания интернет-магазина Django Shop и многих различных приложений, использующих эти технологии.

Права на использование материала, расположенного на этой странице https://vivazzi.pro/ru/it/extended-object-id-already-exists/:

Разрешается копировать материал с указанием её автора и ссылки на оригинал без использования параметра rel="nofollow" в теге <a>. Использование:

Автор статьи: Артём Мальцев
Ссылка на статью: <a href="https://vivazzi.pro/ru/it/extended-object-id-already-exists/">https://vivazzi.pro/ru/it/extended-object-id-already-exists/</a>

Больше: Правила использования сайта

Представляю вашему вниманию книгу, написанную моим близким другом Максимом Макуриным: Секреты эффективного управления ассортиментом.

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

Комментарии: 0

Вы можете оставить комментарий как незарегистрированный пользователь.

Но зарегистрировавшись, вы сможете:

  • получать оповещения об ответах
  • просматривать свои комментарии
  • иметь возможность использовать все функции разработанных сервисов

Для комментирования от своего имени войдите или зарегистрируйтесь на сайте Vuspace

Отправить

На данный момент нет специального поиска, поэтому я предлагаю воспользоваться обычной поисковой системой, например, Google, добавив "vivazzi" после своего запроса.

Попробуйте

Выберите валюту для отображения денежных единиц