2012-12-09 3 views
0
from myapp.models import MyModel 
from cPickle import * 

tmp = MyModel.objects.all()[:1] 
print(loads(dumps(t, -1)) == t) 
#Output is "False" 

필자의 경우 절인 쿼리 결과는 unpickled와 다릅니다. 이미 여기에서 읽었습니다 : https://docs.djangoproject.com/en/dev/ref/models/querysets/#pickling-querysets 이러한 조작이 실제로 허용됩니다. 그럼 내가 뭘 잘못 했니?Pickling Django QuerySet

UPD # 1 : - : - list() 파이썬 목록에 검색어 세트를 변환 가능한 해상도의 cPickle 및 일반 피클 시도는 모두

UPD # 2에서 '거짓'얻었다. https://docs.djangoproject.com/en/dev/ref/models/querysets/#when-querysets-are-evaluated

답변

1

문제는 두 개의 쿼리 세트를 비교하려고하고 쿼리 세트에 __cmp__ 메소드가 정의되어 있지 않다는 것입니다.

그래서, 당신은 그 자체와의 검색어를 비교할 수 있습니다 당신은 얻을 것이다이 : 더 __cmp__ 방법이없는 등, ==는 평가 때문이다

>> tmp == tmp 
True 

True 두 개체는 (같은 동일한 ID가있는 경우 메모리 주소).

>> loads(dumps(tmp, -1)) == tmp 
False 

객체가 서로 다른 메모리 주소를 가지고 있기 때문에 당신이 결과로 False을 얻을 것이다 :이 작업을 수행 할 때, here 그래서

에서 읽을 수 있습니다. 쿼리를 "비슷한"개체로 변환하면 원하는 동작을 얻을 수 있습니다. 시도해보십시오.

>> set(loads(dumps(tmp, -1))) == set(tmp) 
True 

희망 하시겠습니까?

+0

True! 고맙습니다! –