2009-07-17 2 views
11

Ich mag wirklich die Funktion von SQLAlchemy, die Sie sehen können, ob ein Objekt schmutzig ist: ob es geändert wurde, seit es aus der Datenbank abgerufen wurde, oder das letzte Mal, als es gespeichert wurde.Können Sie herausfinden, ob eine Instanz von Django Model "dreckig" ist?

Ist es möglich, diese Informationen vom Django ORM zu finden?

Beachten Sie, dass dies nicht das gleiche wie Dirty fields in django ist, da es mir egal ist, was die vorherigen Daten waren, obwohl S.Lott's Antwort eine Möglichkeit bietet, es zu tun, aber ich möchte einen Weg, der nicht trifft die Datenbank.

Ich habe auch auf die django.db.transaction.is_dirty() geschaut, aber das scheint nicht die Lösung zu sein.

+0

die Frage ist nicht so verschieden sind und die gleichen Antworten auf http://stackoverflow.com/questions/110803/dirty-fields-in-django kann für Ihr Problem – dnozay

+0

Diese Arbeit die gleiche Art von Antwort wie http://stackoverflow.com/a/332225/1733117 – dnozay

Antwort

4

Eine Lösung, die eine Datenbankabfrage macht:

class DirtyMixin(object): 
    @property 
    def is_dirty(self): 
     db_obj = self.__class__.objects.get(self.pk) 
     for f in self._meta.local_fields: 
      if self.__getattribute__(f.name) != db_obj.__getattribute__(f.name): 
       return True 
     return False 

Sie können dann als Vorfahre Klasse zu einem Modell hinzufügen diese. Oder, Affe-Patch die Formen.Modell-Klasse, wenn Sie möchten.

from django.db import models 
models.Model.__bases__ = (DirtyMixin,) + models.Model.__bases__ 
+0

Wird dies nicht eine Ausnahme auslösen, wenn das Modell noch nicht gespeichert wurde? Scheint so, als müsste das gefangen werden und "True" zurückgegeben werden. –

+0

Ja, das ist wahrscheinlich ein Versehen. –

+0

AttributeError: 'MyObject'-Objekt hat kein Attribut' get '. Meinst du nicht etwas wie Selbst .__ Klasse __. Objects.get (pk = self.pk)? – Julian

2

Ein anderer Weg, an denen __setattr__ überschreiben, ist in einiger Länge in this Django ticket diskutiert.

+0

Dies ist eine gute Antwort, wäre aber besser, wenn Code und nicht nur ein Link enthalten wäre. – poolie

1

Versuch Verwendung lck.django Klasse TimeTrackable

+0

Schön. Das sieht nach einer leistungsfähigen Methode aus. –

Verwandte Themen