是否有一种简单的方法可以与实体进行比较以检查属性值差异?我想要这样的:比较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) –