2013-04-12 9 views
7

Ich habe ein Django Modell mit 2 ManyToMany Feldern. Ich möchte die Daten aus dem Modell jedes Mal verarbeiten, wenn es gespeichert wurde.Django Signal nachdem das ganze Modell gespeichert wurde

Das post_save Signal wird gesendet, bevor es die ManyToMany Beziehungen speichert, also kann ich das nicht verwenden. Dann hast du das m2m_changed Signal, aber da ich 2 ManyToMany Felder habe, kann ich nicht sicher sein, auf welches ManyToMany Feld ich das Signal setzen sollte.

Gibt es kein Signal, das ausgelöst wird, nachdem alle ManyToMany Felder gespeichert wurden?

+0

Versuchen Sie dies, über eine Google gefunden: http://techblog.ironfroggy.com/2011/02/django-how-to-hook-in-after-multiple.html - könnte Ihnen einige Hinweise geben –

+0

Danke, aber Die Lösung auf dem von Ihnen geposteten Link funktioniert nur, wenn Sie nur den Django-Administrator verwenden. Ich brauche Unterstützung, wenn das Modell auch außerhalb des Django-Admins gespeichert wurde. – rednaw

+0

http://StackOverflow.com/Questions/1221878/Why-does-django-post-save-signal-give-me-pre-save-data – catherine

Antwort

3

Ich fühle mich wie die einzige Option ist, die Daten nach jeder m2m_change zu verarbeiten, da es kein Ereignis oder Signal zu sein scheint, dass "alle verwandten Daten auf diesem Modell gespeichert ist zu beenden."

Wenn dies hohe Kosten verursacht, können Sie die Verarbeitung asynchron verarbeiten. Als ich eine ähnliche Situation vorfand, fügte ich dem Modell ein boolesches Feld hinzu, um den Zustand im Zusammenhang mit der Verarbeitung zu behandeln (z. B. MyModel.needs_processing) und eine separate asynchrone Aufgabenwarteschlange (in meinem Fall Sellerie) würde jede Minute durchlaufen und die Verarbeitung übernehmen/Zustand zurücksetzen.

In Ihrem Fall, wenn m2m_changed und needs_processingFalse ist, Sie needs_processing-True und speichern Sie das Modell einstellen könnte, es für die Verarbeitung durch Ihre Aufgabe Warteschlange markieren. Selbst dann, wenn das zweite m2m_changed für das andere m2m-Feld ausgelöst wird, würde es keine doppelten Verarbeitungskosten verursachen.

Verwandte Themen