2009-07-17 19 views
11

Bardzo podoba mi się funkcja SQLAlchemy, która pozwala sprawdzić, czy obiekt jest brudny: jeśli został zmodyfikowany, ponieważ został pobrany z bazy danych lub ostatni raz został zapisany.Czy możesz dowiedzieć się, czy instancja Django Model jest "brudna"?

Czy można znaleźć te informacje z ORM Django?

Pamiętaj, że to nie to samo, co Dirty fields in django, ponieważ nie obchodzi mnie, jakie były poprzednie dane, chociaż odpowiedź S.Lotta może to umożliwić, ale chciałbym, żeby nie trafił baza danych.

Spojrzałem również na django.db.transaction.is_dirty(), ale nie wydaje się to być rozwiązaniem.

+0

pytanie nie jest tak różne i te same odpowiedzi na http://stackoverflow.com/questions/110803/dirty-fields-in-django może pracować dla swojego problemu – dnozay

+0

to ten sam rodzaj odpowiedzi, co http://stackoverflow.com/a/332225/1733117 – dnozay

Odpowiedz

4

Rozwiązanie, które ma wykonać zapytania do bazy danych:

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 

Następnie można dodać to jako klasy przodek modelu. Lub, jeśli chcesz, dopasuj małpy do formularzy.

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

Czy nie spowoduje to wyjątku, jeśli model nie został jeszcze zapisany? Wygląda na to, że powinno się złapać i przywrócić 'True'. –

+0

Tak, to prawdopodobnie niedopatrzenie. –

+0

AttributeError: Obiekt "MyObject" nie ma atrybutu "get". Czy nie masz na myśli czegoś takiego jak self .__ class __. Objects.get (pk = self.pk)? – Julian

2

inny sposób, obejmujące nadrzędne __setattr__ omawiany jest w pewnej długości w this Django ticket.

+0

To jest dobra odpowiedź, ale byłoby lepiej, gdyby zawierał kod, a nie tylko link. – poolie

Powiązane problemy