2012-06-08 2 views
0

나는 장황한 모델 객체에 문제가있다. 내가 사용하려고 할 때 적용하고자하는 다소 복잡한 고유성/구별 성 제약을 위해 __hash__()을 재정의했다. 이것은 메모리에서 직접 인스턴스화했지만 데이터베이스에서 검색하는 객체가 아니라 객체에서 올바르게 작동합니다. 이처럼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 

흠. 여기에 사용 된 해쉬 함수가 무엇이든, 그것은 내 것이 아닙니다. 나는 그것이 완전히 인스턴스화 된 상태에 있지 않은 게으른 인출/객체와 관련이 있다고 생각합니다. 그러나 그것을 얻는 방법은 무엇입니까?

답변

3

__eq__을 구현하지 않고 __hash__을 구현했기 때문입니다. __eq__도 구현하면 좋은 결과를 얻을 수 있습니다.

set([a, b])의 길이는 장고가 개체의 기본 키를 비교하는 기본 __eq__ 함수를 정의하기 때문에 1입니다 - 그래서 그들은 저장하기 전에,와 모두 Noneid, 그래서 a == bTrue 될 것입니다 있습니다. 저장 후 서로 다른 기본 키가 할당되므로 a != bTrue이됩니다.

+0

실제로 그렇습니다. 고맙습니다. – AlanL

관련 문제