2011-09-08 52 views
2

是否有一種簡單的方法可以與實體進行比較以檢查屬性值差異?我想要這樣的:比較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'這裏不是副本 - 它只是對同一個對象的另一個引用。此檢查將始終返回「True」。 –

+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

我不知道它有多昂貴。除非你有一個非常大的數據集,否則這個與任何可能更快的事情之間的時間差可能可以忽略不計。 –