2009-07-17 24 views
11

Me gusta mucho la función de SQLAlchemy que le permite ver si un objeto está sucio: si se ha modificado desde que se recuperó de la base de datos o la última vez que se guardó.¿Puedes averiguar si una instancia de Django Model está "sucia"?

¿Es posible encontrar esta información en el ORM de Django?

Tenga en cuenta que esto no es lo mismo que Dirty fields in django, ya que no me importan los datos anteriores, aunque la respuesta de S.Lott puede proporcionar una forma de hacerlo, pero me gustaría una forma que no afecte la base de datos.

También he mirado el django.db.transaction.is_dirty(), pero esta no parece ser la solución.

+0

la cuestión no es tan diferente y las mismas respuestas a http://stackoverflow.com/questions/110803/dirty-fields-in-django puede trabajar para su problema de esto es – dnozay

+0

el mismo tipo de respuesta que http://stackoverflow.com/a/332225/1733117 – dnozay

Respuesta

4

una solución que hacer una consulta de base de datos:

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 

A continuación, puede añadir esto como una clase ancestro a un modelo. O, mono-parche las formas. Clase de modelo, si quieres.

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

¿No arrojará esto una excepción si el modelo no se ha guardado aún? Parece que eso debería ser atrapado y devuelto 'Verdadero'. –

+0

Sí, eso es probablemente un descuido. –

+0

AttributeError: el objeto 'MyObject' no tiene atributo 'get'. ¿No te refieres a algo como self .__ class __. Objects.get (pk = self.pk)? – Julian

2

Otra forma, con la participación anulando __setattr__, se discute con cierto detalle en this Django ticket.

+0

Esta es una buena respuesta, pero sería mejor si incluyera código no solo un enlace. – poolie

Cuestiones relacionadas