0
from myapp.models import MyModel
from cPickle import *

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

私の場合、pickledクエリの結果はunpickledとは異なります。私はすでにここを読んだ: https ://docs.djangoproject.com/en/dev/ref/models/querysets/#pickling-querysets そのような操作が実際に許可されている。だから-私は何が間違っているのですか?

upd#1:cPickleと通常のPickleを試しました-両方から「False」を取得しました

upd#2:可能な解決策-QuerySetを。を使用してPythonリストに変換しlist()ます。これらを読んでいる間にそれを見つけました:https ://docs.djangoproject.com/en/dev/ref/models/querysets/#when-querysets-are-evaluated

4

1 に答える 1

1

__cmp__問題は、2つのクエリセットを比較しようとしていて、クエリセットにメソッドが定義されていないことです。

したがって、クエリセットをそれ自体と比較すると、次のようになります。

>> tmp == tmp
True

__cmp__これは、メソッドがないため、両方のオブジェクトが同じID(同じメモリアドレス)を持っているかどうかを==評価するためです。ここTrueから読むことができます

したがって、これを行うと:

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

Falseオブジェクトのメモリアドレスが異なるため、結果としてが得られます。クエリを「比較可能な」オブジェクトに変換すると、必要な動作を得ることができます。これで試してください:

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

それが役に立てば幸い!

于 2012-12-13T02:50:17.713 に答える