Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 23, 2013 23:24:21

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

m2m_changed post_remove

Всем привет

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

Хотел воспользоваться m2m_changed, когда action=“post_remove”, но такое событие, как выяснилось, m2m_changed не отлавливает при удалении записи. Поискал причины, где-то пишут, что это баг, где-то предполагают, что логика у post_remove иная.

Нашёл такое решение
Но пока не особо понял его. Наверняка кто-то сталкивался с этим. Как решали проблему?



Отредактировано Budulianin (Авг. 23, 2013 23:25:00)

Офлайн

#2 Авг. 24, 2013 12:43:13

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

m2m_changed post_remove

А почему нельзя просто в post_delete объекта, изменять другой объект?
Например, объекты A <–m2m–> B.
Удаляется A, ловим post_delete, смотрим, с чем он соединён и изменяем B

Офлайн

#3 Авг. 24, 2013 13:43:17

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

m2m_changed post_remove

lorien
А почему нельзя просто в post_delete объекта, изменять другой объект?Например, объекты A <–m2m–> B.Удаляется A, ловим post_delete, смотрим, с чем он соединён и изменяем B

Потому что после post_delete связи с другой таблицей уже нет
def post_delete_category_count(sender, instance, **kwargs)
    print(instance.categories.all())
post_delete.connect(post_delete_category_count, Article)
Выведет
[]



Отредактировано Budulianin (Авг. 24, 2013 13:52:10)

Офлайн

#4 Авг. 24, 2013 21:07:31

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

m2m_changed post_remove

А если pre_delete?

Офлайн

#5 Авг. 25, 2013 01:53:26

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

m2m_changed post_remove

lorien
А если pre_delete?

pre_delete конечно можно, НО смущает меня такой подход :)

Неизвестно ещё, удалится запись или нет, а мы уже производим действия, как будто она удалилась.

Пока что оставил pre_delete, но всё таки что-то надо придумать, чтобы именно после удаления работало



Офлайн

#6 Авг. 25, 2013 04:38:35

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

m2m_changed post_remove

Во время pre_delete вы можете в redis или может быть в какой-нить runt-time объект сохранять ID связанного объекта и уже затем в post_delete удалять его.

Офлайн

#7 Авг. 25, 2013 10:59:31

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

m2m_changed post_remove

lorien
Во время pre_delete вы можете в redis или может быть в какой-нить runt-time объект сохранять ID связанного объекта и уже затем в post_delete удалять его.

Спасибо за подсказку



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version