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__がオブジェクトの主キーを比較するデフォルトの関数を定義しているためです。したがって、オブジェクトが保存される前に、両方とものがidあり、のNoneようa == bになりますTrue。保存後、両方に異なる主キーが割り当てられるため、a != bになりますTrue

于 2012-06-08T18:24:42.587 に答える