[Django] Relationen im post_save noch nicht verfügbar

Django, Flask, Bottle, WSGI, CGI…
Antworten
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Hallo Forum,

ich habe hier das Problem, das ich nach dem Speichern eines Objektes direkt eine Aktion ausführen möchte. Das ist an sich kein Problem, bietet Django dafür doch post_save an. Der folgende Code ist gekürzt:

Code: Alles auswählen

class Task(models.Model):
    branches = models.ManyToManyField(Branch,
        verbose_name="Abteilung", related_name="crontasks")

    def create_due_task(self):
        branches = self.branches.all()

def post_save_task(sender, **kwargs):
    instance = kwargs["instance"]
    instance.create_due_task()

post_save.connect(post_save_task, sender=Task)
create_due_task() wird also aufgerufen nachdem ein Task gespeichert wurde. Allerdings ist branches darin eine leere Liste, wenn das Objekt gerade neu war und ich es das erste Mal speichere. Auch dann, wenn ich über das Admin-Interface gerade ganz viele branches gesetzt habe.
Wenn es bereits einmal gespeichert wurde, dann ist branches voll mit den Einträgen vor dem aktuellen Speichern.
Entweder läuft das in zwei verschiedenen Transaktionen, und die sehen sich deshalb gegenseitig nicht, oder Django speichert zuerst Task, führt dann post_save aus und speichert dann die ManyToMany-Objekte. Oder ich habe irgendwo einen kräftigen Denkfehler.
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Ja, Django speichert m2m nach post_save; die richtigen Signale wären: https://docs.djangoproject.com/en/dev/r ... 2m_changed -- bzw im Admin save_related überschreiben: https://github.com/django/django/blob/m ... ns.py#L957
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Danke!

Ich habe dem Task jetzt einfach eine weitere Methode spendiert, die alle verbundenen DueTask mit seinen branches versorgt. Die habe ich mit m2m_changed verbunden: tut wie es soll.
Antworten