2016-07-26 21 views
1

Ich habe ein Pre-Safe-Signal für eines meiner Modelle. Dieses Pre-Saves-Signal führt einige Hintergrund-API-Aktivitäten aus, um neue und aktualisierte Objekte an Dienstanbieter zu syndizieren und bedeutungslose Daten zurückzugeben, die wir als Referenzen an den Stellen der ursprünglichen Daten speichern.Django Pre-Speichern Signal

Die neuen und Update-Methoden unterscheiden sich in der API.

Im Idealfall würden Benutzer, die ein Update durchführen, die bedeutungslosen Daten aus einem Feld löschen und darüber tippen. Mein Signal müsste wissen, welche Felder aktualisiert wurden, um Änderungen nur für diese Felder zu senden, da das Senden aller Felder in einem Update sinnlose Referenzen als Rohdaten zusätzlich zu den Aktualisierungen senden würde.

Das Pre-Savesignal hat das Argument update_fields. Ich suchte nach einigen Details und fand heraus, dass dieses Argument alle Felder enthalten kann, wenn ein Update durchgeführt wird.


In Bezug auf update_fieldswie die docs haben wenig Informationen über dieses

  • Wenn Sie ein Objekt erstellen, wird alles übergeben bekommen update_fields?
  • Werden beim Aktualisieren eines Objekts alle Felder an update_fields übergeben, oder nur diejenigen, die aktualisiert wurden?

Gibt es noch andere Vorschläge, wie Sie das angehen können? Ich weiß, post_save hat das Argument created, aber ich würde lieber auf die Daten vor dem Speichern arbeiten.

Antwort

2

Wird beim Erstellen eines Objekts irgendetwas an update_fields übergeben?

No.

Wenn ein Objekt aktualisiert wird, werden alle Felder an update_fields übergeben, oder nur diejenigen, die aktualisiert wurden?

abhängig, der die save() Methode aufruft. Standardmäßig setzt Django update_fields nicht. Sofern Ihr Code save() mit dem Argument update_fields nicht aufruft, werden alle Felder in der Datenbank neu geschrieben und das pre_save Signal wird update_fields=None angezeigt.

Mein Signal müsste wissen, welche Felder aktualisiert wurden, um Änderungen nur für diese Felder zu senden.

Es sei denn, Sie steuern, was die save() Methode für das Objekt aufruft, werden Sie diese Informationen nicht erhalten update_fields verwenden. Der Zweck dieses Arguments besteht nicht darin, Sie nachverfolgen zu lassen, welche Felder sich geändert haben - es soll vielmehr ein effizientes Schreiben von Daten ermöglichen, wenn Sie wissen, dass nur bestimmte Spalten in der Datenbank geschrieben werden müssen.

+0

Ich werde ein separates Update-Formular schreiben und 'update_fields' dort einstellen ... – henryaaron