Python 比较2个模型实体
是否有一种与实体进行比较以检查属性值差异的简单方法?我想要这样的东西:Python 比较2个模型实体,python,google-app-engine,Python,Google App Engine,是否有一种与实体进行比较以检查属性值差异的简单方法?我想要这样的东西: 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.contr
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\u me
实际上不是me
的克隆,而是me
对于最简单的场景,你可以逐个字段比较对象,例如
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\u me
实际上不是me
的克隆,而是me
尝试使用集合:
differences = set(me.__dict__) ^ set(cloned_me.__dict__)
if differences:
self.response.out.write('These 2 objects have different property values')
您甚至可以输出不同的属性(它们包含在新的差异集中)。尝试使用集合:
differences = set(me.__dict__) ^ set(cloned_me.__dict__)
if differences:
self.response.out.write('These 2 objects have different property values')
您甚至可以输出不同的属性(它们包含在新的差异集中)。因此,要创建克隆,我将使用copy.copy?对于克隆,请参见So要创建克隆,我将使用copy.copy?对于克隆,请参见这是一种有效的比较方法吗?根据我的理解,按位比较是昂贵的。我不确定它有多贵。除非您有一个非常大的数据集,否则这与任何可能更快的数据之间的时间差可能可以忽略不计。这是一种有效的比较方法吗?根据我的理解,按位比较是昂贵的。我不确定它有多贵。除非您有一个非常大的数据集,否则这与任何可能更快的数据集之间的时间差可能可以忽略不计。
cloned\u me
在这里不是副本-它只是对同一对象的另一个引用。此检查将始终返回True
。克隆的me
的可能副本在此处不是副本-它只是对同一对象的另一个引用。此检查将始终返回True