0

我有一个 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

唔。无论这里使用什么散列函数,它都不是我的。我想这与尚未完全实例化状态的延迟获取/对象有关,但是如何绕过它呢?

4

1 回答 1

3

这是因为您已经实施__hash__而没有实施__eq__. 实施__eq__以及你应该很高兴。

的长度set([a, b])1因为 Django 定义了一个默认__eq__函数来比较对象的主键 - 所以在保存它们之前,两者都有一个idof None,所以a == b将是True。保存后,它们都将被分配不同的主键,a != b因此True.

于 2012-06-08T18:24:42.587 回答