2013-04-12 24 views
7

Mam model Django z polami 2 ManyToMany. Chcę przetwarzać dane z modelu za każdym razem, gdy został zapisany.Sygnał Django po zapisaniu całego modelu

Sygnał post_save jest wysyłany, zanim zapisuje relacje ManyToMany, więc nie mogę go użyć. Wtedy masz sygnał m2m_changed, ale ponieważ mam 2 ManyToMany pól, nie mogę być pewien, na którym polu powinienem umieścić sygnał.

Czy nie ma sygnału, który zostanie wyzwolony po zapisaniu wszystkich pól ManyToMany?

+0

Spróbuj tego, znalezionego przez google: http://techblog.ironfroggy.com/2011/02/django-how-to-hook-in-after-multiple.html - może dać ci kilka wskazówek. –

+0

rozwiązanie zamieszczonego linku działa tylko wtedy, gdy używasz tylko administratora Django. Potrzebuję wsparcia, gdy model zostanie zapisany także poza adminem Django. – rednaw

+0

http://stackoverflow.com/questions/1221878/why-does-django-post-save-signal-give-me-pre-save-data – catherine

Odpowiedz

3

Czuję, że jedyną opcją jest przetwarzanie danych po każdym m2m_change, ponieważ nie wydaje się, aby zdarzenie lub sygnał mapował do "wszystkie powiązane dane w tym modelu zakończyły zapisywanie."

Jeśli jest to wysoki koszt, można przetwarzać przetwarzanie asynchronicznie. Gdy napotkałem podobną sytuację, dodałem do modelu boolowskie pole do obsługi stanu związane z przetwarzaniem (np. MyModel.needs_processing) i oddzielną asynchroniczną kolejką zadań (Seler, w moim przypadku) przeszukiwał każdą minutę i obsługiwał przetwarzanie/resetowanie stanu.

W twoim przypadku, jeśli m2m_changed i needs_processing jest False, można ustawić needs_processing do True i zapisać model, oznaczając go do przetworzenia przez kolejki zadań. Następnie, nawet gdy drugie urządzenie wykaże drugie pole m2m, nie spowoduje to podwójnych kosztów przetwarzania.

Powiązane problemy