比较 2 个模型实体

Posted

技术标签:

【中文标题】比较 2 个模型实体【英文标题】:Comparing 2 model entities 【发布时间】:2011-11-13 03:09:13 【问题描述】:

是否有一种简单的方法可以与实体进行比较以检查属性值差异?我想要这样的东西:

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' )

【问题讨论】:

cloned_me 不是这里的副本 - 它只是对同一对象的另一个引用。此检查将始终返回 True Elegant way to avoid .put() on unchanged entities 的可能重复项 【参考方案1】:

尝试使用集合:

differences = set(me.__dict__) ^ set(cloned_me.__dict__)
if differences:
    self.response.out.write('These 2 objects have different property values')

您甚至可以输出不同的属性(它们包含在新的差异集中)。

【讨论】:

这是一种有效的比较方法吗?据我了解,按位比较很昂贵。 我不确定它有多贵。除非您有一个非常大的数据集,否则这与任何可能更快的时间之间的时间差异可能可以忽略不计。【参考方案2】:

对于最简单的场景,您可以逐个字段比较对象,例如

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'

如果您需要进一步比较外键等,您可以稍后对其进行改进

我想你知道在你的例子中clone_me实际上不是me的克隆,它是me

【讨论】:

所以要克隆我会使用 copy.copy? 克隆见***.com/questions/4733609/…

以上是关于比较 2 个模型实体的主要内容,如果未能解决你的问题,请参考以下文章

比较2个实体对象——CompareUtil工具类

比较2个实体对象——CompareUtil工具类

java 实体bean 的比较,并获取2个实体中不同的属性

命名规范

用深度学习做命名实体识别——模型训练

实体具有某些共同属性时的模型结构