0
from myapp.models import MyModel
from cPickle import *

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

在我的情况下,腌制查询结果与未腌制不同。我已经在这里读到: https ://docs.djangoproject.com/en/dev/ref/models/querysets/#pickling-querysets 实际上允许这样的操作。那么 - 我做错了什么?

upd #1:尝试了 cPickle 和常规 Pickle - 两者都得到了“假”

upd #2:可能的解决方案 - 使用 . 将 QuerySet 转换为 Python 列表list()。在阅读这些内容时发现它:https ://docs.djangoproject.com/en/dev/ref/models/querysets/#when-querysets-are-evaluated

4

1 回答 1

1

问题是您正在尝试比较两个查询集,而查询集没有__cmp__定义方法。

因此,您可以将查询集与其自身进行比较,您将得到:

>> tmp == tmp
True

这是因为,由于没有__cmp__方法,因此==评估True两个对象是否具有相同的标识(相同的内存地址)。你可以从这里阅读

所以,当你这样做时:

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

你会得到一个False结果,因为对象有不同的内存地址。如果将查询转换为“可比较”对象,则可以获得所需的行为。试试这个:

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

希望能帮助到你!

于 2012-12-13T02:50:17.713 回答