Python 重写peewee.Model对象上的_散列__;安全吗?

Python 重写peewee.Model对象上的_散列__;安全吗?,python,orm,peewee,Python,Orm,Peewee,我最近注意到,我的一组引用相同数据的peewee模型对象没有被识别为等效对象,即使它们包含相同的数据 在这些人身上覆盖哈希安全吗?它似乎是可行的,但我不希望它在将来意外地回来咬我——散列会弄乱我应该担心的内部状态到记录的映射吗 class User(PowertailMeta): name = CharField(unique=True) password = CharField(null=False) balance = FloatField(default=10.0)

我最近注意到,我的一组引用相同数据的peewee模型对象没有被识别为等效对象,即使它们包含相同的数据

在这些人身上覆盖哈希安全吗?它似乎是可行的,但我不希望它在将来意外地回来咬我——散列会弄乱我应该担心的内部状态到记录的映射吗

class User(PowertailMeta):
    name = CharField(unique=True)
    password = CharField(null=False)
    balance = FloatField(default=10.0)
    cap = FloatField(default=60, constraints=[Check('cap >= 0')])
    is_admin = BooleanField(default=False)
    last_login = DateTimeField(default=datetime.now)
    picture = CharField(default="porp")

    def __hash__(self):
       return hash(self.name) # since name is unique...

这通过了一些琐碎的测试,但我不确定我可能需要寻找什么。

\uuuuu散列\uuuuuu
最近已添加到
peewee.Model
,请参阅。它还没有发布,但我认为它将出现在2.8.1中

实施相当简单:

def __hash__(self):
    return hash((self.__class__, self._get_pk_value()))
(in)

因此,它依赖于模型类和主键。如果您有其他需要,我认为覆盖它没有任何问题。但是,根据您建议的解决方案,请考虑以下内容:

class User(Model):
    name = CharField(unique=True)

    def __hash__(self):
        return hash(self.name)

class User(Model):
    label = CharField(unique=True)

    def __hash__(self):
        return hash(self.label)
这是两个不同的模型,即使使用不同的字段,但它们会产生相同的哈希值