|
15 / 12 / 4
Регистрация: 06.04.2020
Сообщений: 95
|
|||||||||||||||||||||
Post_delete. Жизнь после смерти25.06.2020, 00:53. Показов 1929. Ответов 7
Метки нет (Все метки)
Есть у меня модели Topic и Comment, который с Topic через ForeignKey связан:
DoesNotExist at /forum/topic/remove/1/ Topic matching query does not exist. Я вообще не очень понимаю, как можно обращаться к объекту в post_delete - он же уже удалён. А Topic ещё ведь не удалён? После ошибки в базе и Topic, и его комменты на месте. View (удалять можно только Topic из корзины - is_delete=True):
0
|
|||||||||||||||||||||
| 25.06.2020, 00:53 | |
|
Ответы с готовыми решениями:
7
Жизнь после смерти жизнь после смерти - объект Session Docker byebug, если жизнь после смерти? |
|
|
||
| 25.06.2020, 01:15 | ||
|
Добавлено через 5 минут И использование сигналов - не есть хорошо. Это своего рода антипаттерн. Лучше переопределить метод delete у модели.
0
|
||
|
15 / 12 / 4
Регистрация: 06.04.2020
Сообщений: 95
|
|
| 25.06.2020, 01:38 [ТС] | |
|
Ещё раз обращаю внимание, что удаляю Topic, а сигнал от Comment
Traceback (most recent call last): File "D:\Work\PyCharmProject\forum_sc\forum\t ests\test_models.py", line 246, in test_demiurg reverse(app_name + ':topic-remove', kwargs={'topic_pk': topic_pk}), params_for_recycling, follow=True) File "c:\python37\lib\site-packages\django\test\client.py", line 543, in post response = super().post(path, data=data, content_type=content_type, secure=secure, **extra) File "c:\python37\lib\site-packages\django\test\client.py", line 357, in post secure=secure, **extra) File "c:\python37\lib\site-packages\django\test\client.py", line 422, in generic return self.request(**r) File "c:\python37\lib\site-packages\django\test\client.py", line 503, in request raise exc_value File "c:\python37\lib\site-packages\django\core\handlers\exception. py", line 34, in inner response = get_response(request) File "c:\python37\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response response = self.process_exception_by_middleware(e, request) File "c:\python37\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "c:\python37\lib\site-packages\django\views\generic\base.py", line 71, in view return self.dispatch(request, *args, **kwargs) File "c:\python37\lib\site-packages\braces\views\_access.py", line 102, in dispatch request, *args, **kwargs) File "c:\python37\lib\site-packages\django\views\generic\base.py", line 97, in dispatch return handler(request, *args, **kwargs) File "c:\python37\lib\site-packages\django\views\generic\edit.py", line 218, in post return self.delete(request, *args, **kwargs) File "D:\Work\PyCharmProject\forum_sc\forum\v iews.py", line 392, in delete return super().delete(request, *args, **kwargs) File "c:\python37\lib\site-packages\django\views\generic\edit.py", line 213, in delete self.object.delete() File "c:\python37\lib\site-packages\django\db\models\base.py", line 919, in delete return collector.delete() File "c:\python37\lib\site-packages\django\db\models\deletion.py", line 318, in delete sender=model, instance=obj, using=self.using File "c:\python37\lib\site-packages\django\dispatch\dispatcher.py", line 175, in send for receiver in self._live_receivers(sender) File "c:\python37\lib\site-packages\django\dispatch\dispatcher.py", line 174, in <listcomp> (receiver, receiver(signal=self, sender=sender, **named)) File "D:\Work\PyCharmProject\forum_sc\forum\s ignals.py", line 41, in reduce_topic_answer if hasattr(instance, 'topic'): # На случай отработки CASCADE File "c:\python37\lib\site-packages\django\db\models\fields\related _descriptors.py", line 178, in __get__ rel_obj = self.get_object(instance) File "c:\python37\lib\site-packages\django\db\models\fields\related _descriptors.py", line 145, in get_object return qs.get(self.field.get_reverse_related_fi lter(instance)) File "c:\python37\lib\site-packages\django\db\models\query.py", line 408, in get self.model._meta.object_name forum.models.Topic.DoesNotExist: Topic matching query does not exist. Добавлено через 7 минут > И использование сигналов - не есть хорошо. Это своего рода антипаттерн. Лучше переопределить метод delete у модели. Это прямо для всех сигналов? Можете пояснить? У меня поле менялось в разных вьюшках, а реагировать на это надо было одинаково. Сигнал post_save - ну то, что доктор прописал. Во всяком случае, мне так казалось. Какие тут подводные камни?
0
|
|
|
|
||
| 25.06.2020, 01:51 | ||
|
Shandrik, зачем тебе здесь вообще сигнал - не пойму?
Добавлено через 1 минуту По своему опыту скажу, что лучше в самых крайних случаях их использовать. И у тебя не тот случай... Добавлено через 31 секунду Должно быть достаточно переопределить delete у модели.Добавлено через 10 минут Я верно понимаю, что тебе нужно? 1. Удаляешь Topic.2. Срабатывает CASCADE - удаляются все связанные комменты.3. Пытаешься снова зачем-то вытащить Topic, который уже удалён, по идее.4. Пытаешься найти все Comment для этого топика.5. Проводишь манипуляции с этими Comment.6. Проводишь манипуляции с этим Topic.Если так, то это очень странное флоу. Ладно, если бы ты удалял Comment - я бы ещё мог понять...
0
|
||
|
15 / 12 / 4
Регистрация: 06.04.2020
Сообщений: 95
|
|||
| 25.06.2020, 01:56 [ТС] | |||
|
Добавлено через 3 минуты А то, что он сюда попадает при удалении topic - это исключительно из-за CASCADE. В этом случае выполнение тела сигнала не требуется.
0
|
|||
|
|
|||||||||||
| 25.06.2020, 03:24 | |||||||||||
Сообщение было отмечено Shandrik как решение
Решение
Shandrik,
Если будешь удалять кверисет, то придётся также переписывать менеджер. Если нет, то достаточно только заоверрайдить метод delete у самой модели.
Добавлено через 53 минуты Если немного подрефакторить твой код, то можно переписать так (моржовый оператор можно использовать, если версия питона 3.8+):
1
|
|||||||||||
|
15 / 12 / 4
Регистрация: 06.04.2020
Сообщений: 95
|
||
| 25.06.2020, 23:07 [ТС] | ||
|
Добавлено через 1 час 51 минуту Вобщем, перенёс в delete модели. Странно, но теперь при удалении родительского Топика этот delete не отрабатывается. Пока что это - то, что доктор прописал, но могут появиться задачи, где он нужен будет. Посмотрим...
0
|
||
|
|
|
| 26.06.2020, 03:28 | |
|
0
|
|
| 26.06.2020, 03:28 | |
|
Помогаю со студенческими работами здесь
8
Что такое сознание и есть ли жизнь после смерти? Сигналы post_delete и pre_delete Жизнь после С++ Жизнь после Windows Жизнь БП после перегрева Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|