Ключ (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
(Расширение страницы).
Ещё нужно сказать, что ошибка не всегда проявляется при публикации страницы. Чтобы воспроизвести ошибку нужно:
- Создать расширение (или по-другому "Сохранить" из Меню / Страница / Моё расширение)
- Опубликовать страницу
- Перейти на черновую версию, щёлкнув "Изменить"
- Удалить расширение (Перейдя в Меню / Страница / Моё расширение и щёлкнув "Удалить")
- Снова создать расширение (Меню / Страница / Моё расширение)
- И попытаться опубликовать страницу.
На шестом шаге появляется ошибка.
Оказывается при публикации не стирается старый объект 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