Seite 1 von 1

[Django] Relationen im post_save noch nicht verfügbar

Verfasst: Dienstag 29. Oktober 2013, 12:59
von sparrow
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.

Re: [Django] Relationen im post_save noch nicht verfügbar

Verfasst: Dienstag 29. Oktober 2013, 14:31
von apollo13
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

Re: [Django] Relationen im post_save noch nicht verfügbar

Verfasst: Dienstag 29. Oktober 2013, 15:47
von sparrow
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.