2014-12-30 2 views
1

мне нужно что-то вроде m2m_changed сигнал:Как отслеживать изменения полей m2m в django?

def event_handler(sender, instance, **kwargs): 
    pass 
m2m_changed.connect(event_handler, sender=MyModel.tags.through) 

, но я хочу знать предыдущее состояние instance.tags в event_handler

+0

Мне нужно сделать некоторые действия, если теги были изменены. – kalombo

ответ

0

Посмотрите в документации Django:

https://docs.djangoproject.com/en/dev/ref/signals/#m2m-changed

Вы должны уметь использовать параметры обработчика сигналов action и pk_set, чтобы выяснить, что произошло.

+1

Это не работает для меня. Я работаю с django-admin. Когда я меняю свою модель, у меня всегда есть 2 запроса: удалите все поля m2m из модели, а затем добавьте m2m-поля из запроса POST в мою модель. Например, у меня есть модель с m2m полями [3,6,7,8]. Я хочу удалить поле «8». Когда я это делаю, у меня есть 2 сигнала (4 технически, но это не имеет значения): первый - ** pre/post_clear ** с ** pk_set ** - ** Нет **, а второй - ** pre/post_add ** с ** pk_set ** - ** [3,6,7] **. Поэтому я не знаю, что произошло в обработчике сигналов. – kalombo

+2

В 'pre_remove',' pre_clear' и 'pre_add' вы должны иметь доступ к' instance.tags', чтобы получить теги * до * изменения. – mbrochh

2

Уверен, что вы нашли решение уже сейчас. Однако для других ссылок вы можете это сделать, проверив kwargs['action'] == "pre_add" или kwargs['action'] == "pre_remove", чтобы проверить значение до того, как произойдет какое-либо обновление. Вы можете найти более подробную информацию here.

Смежные вопросы