在peewee.Model对象上覆盖__hash__是否安全?

时间:2015-10-06 05:52:26

标签: python orm peewee

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

在这些人身上覆盖__hash__是否安全?它出现可以工作但是我不会想要回来并在将来意外地咬我 - 这样做会像内部状态那样记录我的映射应该担心吗?

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...

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

1 个答案:

答案 0 :(得分:1)

Visual Studio Professional最近已添加到__hash__,请参阅https://github.com/coleifer/peewee/issues/879。它尚未发布,但我认为它将在2.8.1中。

实施相当简单:

peewee.Model

https://github.com/coleifer/peewee/commit/4de894aeebf7245d4fb6c4f412c7a09a2c039d8a#diff-eb0556c6b1b9232ba053c4cea13ff075R4786

因此,它依赖于模型类和主键。如果您有其他需求,我不会在覆盖它时遇到任何问题。但是,根据您建议的解决方案,请考虑以下事项:

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

这是两个不同的模型,即使使用不同的字段,但它们会产生相同的哈希值。