Ключ (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 оценок)

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

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

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

Автор статьи

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

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

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

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

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

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

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

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

Для комментрирования от своего имени, войдите или зарегистрируйтесь обычным способом или через социальные сети:

Отправить

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

Попробуйте