2009-07-17 3 views
11

정말 SQLAlchemy의 기능이 좋기 때문에 개체가 더러운 지 확인할 수 있습니다. 데이터베이스에서 검색 한 이후 또는 마지막으로 저장된 시간이 수정 된 경우입니다.Django Model 인스턴스가 "더티"인지 알 수 있습니까?

Django ORM에서이 정보를 찾을 수 있습니까?

S.Lott의 대답이이 방법을 제공 할 수도 있지만 이전 데이터가 무엇이든 상관하지 않기 때문에 이것은 Dirty fields in django과 같지 않습니다. 그러나 나는 치지 않는 방법을 원합니다. 데이터베이스

나는 또한 django.db.transaction.is_dirty()을 보았지만 이것이 해결책이 아닌 것 같습니다. 데이터베이스 쿼리를 수행합니까

+0

문제는 그리 다르 http://stackoverflow.com/questions/110803/dirty-fields-in-django에 같은 답변은 문제 이것이 – dnozay

+0

작동 할 수있다 http://stackoverflow.com/a/332225/1733117와 같은 종류의 대답 – dnozay

답변

4

해결책은 :

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 

그런 다음 모델 조상 클래스로이를 추가 할 수 있습니다. 또는 원숭이가 양식을 패치하십시오. 원한다면 모델 클래스. __setattr__를 오버라이드 (override) 포함

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

모델이 아직 저장되지 않은 경우 예외가 발생하지 않습니까? 그걸 잡아서 'True'가 반환 된 것처럼 보입니다. –

+0

그래, 아마도 그게 감독 일세. –

+0

AttributeError : 'MyObject'객체에 'get'속성이 없습니다. 자기 같은 것을 의미하지는 않습니까? class __. objects.get (pk = self.pk)? – Julian

2

또 다른 방법은, this Django ticket에 어떤 길이에서 논의된다.

+0

좋은 답변이지만 단순한 링크가 아닌 코드가 포함 된 경우 더 좋을 것입니다. – poolie

1

시도 사용 lck.django 클래스 TimeTrackable

+0

니스. 그것은 그것을하는 강력한 방법처럼 보입니다. –

관련 문제