Ein paar Mal bin ich in eine Situation geraten, wenn ich zum Zeitpunkt der Speicherung wissen muss, welche Modellfelder aktualisiert werden und entsprechend handeln.Verfolgen der Änderungen seit dem letzten Speichern in Django-Modellen
Die naheliegendste Lösung ist das primäre Schlüsselfeld zu nehmen und eine Kopie des Modells aus der Datenbank abrufen:
class MyModel(models.Model):
def save(self, force_insert=False, force_update=False, using=None):
if self.id is not None:
unsaved_copy = MyModel.objects.get(id=self.id)
# Do your comparisons here
super(MyModel, self).save(force_insert, force_update, using)
Das funktioniert jedoch völlig in Ordnung, es die Datenbank Treffer für jede Instanz das Modell, das Sie speichern (ist möglicherweise ziemlich unbequem, wenn Sie viele solcher Speicherungen durchführen).
Es ist offensichtlich, dass, wenn man sich die alten Feldwerte zu Beginn der Lebensdauer der Modellinstanz (__init__
) "merken" kann, es nicht notwendig sein sollte, eine Kopie des Modells aus der Datenbank zu erhalten. So kam ich mit diesem kleinen Hack up:
class MyModel(models.Model):
def __init__(self, *args, **kwargs):
super(MyModel, self).__init__(*args, **kwargs)
self.unsaved = {}
for field in self._meta.fields:
self.unsaved[field.name] = getattr(self, field.name, None)
def save(self, force_insert=False, force_update=False, using=None):
for name, value in self.unsaved.iteritems():
print "Field:%s Old:%s New:%s" % (name, value, getattr(self, name, None))
# old values can be accessed through the self.unsaved member
super(MyModel, self).save(force_insert, force_update, using)
Dies scheint zu funktionieren, aber es ist die Verwendung der nicht-öffentlichen Schnittstelle von django.db.models.Model
macht.
Vielleicht weiß jemand einen saubereren Weg, es zu tun?
Nein, ich habe es nicht im Zusammenhang mit Admin-Vorlagen gefragt, aber ich werde überprüfen, wie es dort gemacht wird, danke für den Tipp. – shylent