Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 比较2个模型实体_Python_Google App Engine - Fatal编程技术网

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