Django:Overrided\uuuuu哈希\uuuuuuu不适用于数据库中的对象?

Django:Overrided\uuuuu哈希\uuuuuuu不适用于数据库中的对象?,django,Django,对于django模型对象,我遇到了一个问题,我已经覆盖了\uuuuu hash\uuuu(),以获得一些在使用它们时想要强制执行的稍微复杂的唯一性/区别性约束。对于我刚刚在内存中直接实例化的对象来说,这很好,但对于我从数据库中检索的对象来说,情况就不一样了 像这样: class Animal(models.Model): name = model.Charfield('name', max_length=10) def__hash__(self): return

对于django模型对象,我遇到了一个问题,我已经覆盖了
\uuuuu hash\uuuu
(),以获得一些在使用它们时想要强制执行的稍微复杂的唯一性/区别性约束。对于我刚刚在内存中直接实例化的对象来说,这很好,但对于我从数据库中检索的对象来说,情况就不一样了

像这样:

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

嗯,不管这里用的是什么哈希函数,它都不是我的。我想这与延迟抓取/尚未处于完全实例化状态的对象有关,但如何绕过它?

这是因为您在未实现
\uuuuuueq\ueq
的情况下实现了
。同时执行
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu


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

这是因为您已实现
\uuuuuuuuuuuuuuuuuuuuuuuuuu
而未实现
\uuuuuuuueq\uuuuuuuuuuuuu
。同时执行
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

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