Django sendet die pre/post_delete Signale, wenn Sie die queryset.delete()
Methode verwenden, aber sollte es nicht dann auch pre/post_save auf queryset.update()
senden?Django: Signal auf queryset.update
Antwort
Vielleicht ist sollte, aber es tut es nicht. .update() ruft die .save() -Methode für die einzelnen Objekte im QuerySet nicht auf und aktualisiert stattdessen alle in einem einzigen SQL-Aufruf (UPDATE, wie es passiert). Da es .save() nicht verwendet, wäre es inkonsistent, die Pre- und Post-Save-Signale aufzurufen. Ich kann mir durchaus Anwendungsfälle vorstellen, in denen man das möchte, aber ich kann mir auch Fälle vorstellen, in denen man es nicht tun würde. Es scheint mir, dass das Aufrufen der Pre- und Post-Save-Signale hier nicht korrekt ist, da es dem Programmierer mehr Flexibilität gibt. Es ist nicht schwer, diese Signale manuell auszulösen, und ich denke, es ist definitiv eine bessere Designentscheidung, Programmierer zu bitten, sich daran zu erinnern, die Signale auszulösen, um das gewünschte Verhalten zu erhalten, als sie zu bitten, die Signale zu trennen, um unerwünschtes Verhalten zu vermeiden.
Nun, obwohl die Gründe erwähnt, ich denke, das ist irgendwie inkonsistent Verhalten, weil die Methode queryset.delete() löscht nicht löscht() auf den einzelnen Instanzen, aber es sendet die gleichen Signale wie model.delete() tut! –
Um in der Lage zu sein, ein save-related-Signal auf einem Abfrage-Set zu senden, müssen sie zusätzlich zu dem Update im Wesentlichen eine Auswahl für die Elemente vornehmen, wodurch die Vorteile einer Massenaktualisierungsmethode eliminiert werden. –