Выполнить действие при изменении статуса модели django

Я застрял на этой проблеме в течение нескольких дней. Как я могу выполнить определенное действие, когда статус объекта был обновлен?

У меня есть модель Order django с полем status. Когда статус заказа меняется с new на processed, мне нужно выполнить определенные действия.

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

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

Кажется, что сигнал post_save может работать, но я не могу найти способ определить, изменился ли статус и каково старое значение.

Я проверил django fsm, но это явно не тот путь.

Любая идея?


person Thibault J    schedule 06.02.2012    source источник
comment
Вы просматривали github.com/Atomidata/django-audit-log?   -  person arie    schedule 06.02.2012
comment
Кажется немного лишним. Кроме того, «…он может отслеживать изменения экземпляров модели, только когда они вносятся через веб-интерфейс вашего приложения. »   -  person Thibault J    schedule 06.02.2012


Ответы (1)


Чтобы определить, какие поля изменились в сигнале post_save, вам каким-то образом нужно запомнить исходное состояние экземпляра модели. Один ответ на Действия, вызванные изменением поля в Django, рассматривает это и указывает на грязные поля в django, где вы можете найти различные примеси, которые позволят вам найти "грязные" поля в вашей модели при сохранении.

person Jan Pöschko    schedule 06.02.2012
comment
Да, но насколько я понимаю, инстанс не создается в случае массового обновления, следовательно, стратегия грязных полей не сработает, верно? - person Thibault J; 06.02.2012
comment
Это правда, update не вызывает save и не запускает сигналы (docs.djangoproject.com/en/dev/topics/db/queries/). Вы можете либо перезаписать update в пользовательском менеджере, чтобы делать то, что хотите, либо напрямую обрабатывать обновления с помощью SQL, например. триггеры: dev.mysql.com/doc/refman/5.0/en/ triggers.html (вообще не связанный с Django/Python). - person Jan Pöschko; 06.02.2012