是否有一種簡單的方法可以與實體進行比較以檢查屬性值差異?我想要這樣的:比較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')
是否有一種簡單的方法可以與實體進行比較以檢查屬性值差異?我想要這樣的:比較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')
對於最簡單的情況,你可以按字段比較對象,例如,
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
所以要一個克隆我會使用copy.copy? – zakdances
克隆請參閱http://stackoverflow.com/questions/4733609/how-do-i-clone-a-django-model-instance-object-and-save-it-to-the-database –
嘗試使用集:
differences = set(me.__dict__)^set(cloned_me.__dict__)
if differences:
self.response.out.write('These 2 objects have different property values')
您甚至可以輸出不同的屬性(它們包含在新的差異集中)。
這是一個高效比較方法?根據我的理解,按位比較是昂貴的。 – zakdances
我不知道它有多昂貴。除非你有一個非常大的數據集,否則這個與任何可能更快的事情之間的時間差可能可以忽略不計。 –
'cloned_me'這裏不是副本 - 它只是對同一個對象的另一個引用。此檢查將始終返回「True」。 –
可能重複[優雅的方式來避免.put()對未改變的實體](http://stackoverflow.com/questions/7330974/elegant-way-to-avoid-put-on-unchanged-entities) –