2011-09-08 5 views
2

엔티티와 비교하여 속성 값 차이를 확인하는 쉬운 방법이 있습니까? 다음과 같은 것을 원합니다.두 모델 엔티티 비교

me = User.get_by_id(28) 
cloned_me = me 

cloned_me.first_name = 'Tom' 

if me != cloned_me: 
    self.response.out.write('These 2 objects have different property values') 
+0

'cloned_me'은 여기에 복사되지 않습니다. 단지 동일한 객체에 대한 다른 참조 일뿐입니다. 이 검사는 항상 '참'을 반환합니다. –

+0

가능한 복제본 [변경되지 않은 엔터티에 대한 .put() 방지 우아한 방법] (http://stackoverflow.com/questions/7330974/elegant-way-to-avoid-put-on-unchanged-entities) –

답변

0

가장 간단한 시나리오는 필드별로 필드를 비교할 수 있습니다.

from django.contrib.auth.models import User 

def compare(user1, user2): 
    for field in user1._meta.fields: 
     val1 = getattr(user1, field.name) 
     val2 = getattr(user2, field.name) 
     if val1 != val2: 
      print "%s differ '%s' != '%s'"%(field.name, val1, val2) 
      break 

compare(User(username="anurag"), User(username="uniyal")) 

출력 :

username differ 'anurag' != 'uniyal' 

이 더 등 foerign 키

을 비교해야하는 경우 나중에 그것을 향상시킬 수 있습니다 그리고 난 당신이 당신의 예에서 clone_me는 사실이 아니라고 알고 있습니다 생각 me의 복제본입니다. me

+0

그래서 나는 copy.copy를 사용할 것인가? 복제를위한 – zakdances

+0

참조 http://stackoverflow.com/questions/4733609/how-do-i-clone-a-django-model-instance-object-and-save-it-to-the-database –

0

세트 사용 시도 :

differences = set(me.__dict__)^set(cloned_me.__dict__) 
if differences: 
    self.response.out.write('These 2 objects have different property values') 

다른 속성 (새로운 차이 세트에 포함됨)을 출력 할 수도 있습니다.

+0

효율적인가? 비교 방법? 내 이해에서 비트 비교는 비쌉니다. – zakdances

+0

나는 그것이 얼마나 비싸지 모르겠다. 당신이 매우 큰 데이터 세트를 가지고 있지 않다면 이것과 아마도 더 빠른 것 사이의 시차는 아마도 무시할 만하다. –