Django:重写__hash__不适用于数据库中的对象?

时间:2012-06-08 18:23:51

标签: django

我遇到了django模型对象的问题,我已经覆盖了__hash__()一些稍微复杂的唯一性/区别性约束,我想在使用它时强制执行。这对我刚刚在内存中直接实例化的对象工作正常,但不适用于我从数据库中检索的对象。

像这样:

class Animal(models.Model):
    name = model.Charfield('name', max_length=10)

    def__hash__(self):
        return len(self.name) # silly example for purposes of illustration

然后这个:

>> a = models.Animal(name='cat')
>> b = models.Animal(name='dog')
>> len(set((a,b))
> 1
>> a.save()
>> b.save()
>> len(set(models.Animal.objects.all()))
> 2

嗯。无论在这里使用什么哈希函数,它都不是我的。我想这是与懒惰的提取/对象有关的东西尚未处于完全实例化的状态,但是如何绕过它呢?

1 个答案:

答案 0 :(得分:3)

这是因为您已实施__hash__而未实施__eq__。同时实施__eq__,你应该好好去。

set([a, b])的长度为1,因为Django定义了一个默认的__eq__函数,用于比较对象的主键 - 因此在保存之前,两者都有{{1} } idNone将是a == b。保存后,他们都会被分配不同的主键,因此True将为a != b