可怕的"不同的对象错误"腌制queryset.query对象

Bac*_*con 23 python django serialization pickle

我有一个查询集,我需要懒惰地腌制,我有一些严重的麻烦.cPickle.dumps(queryset.query)抛出以下错误:

Can't pickle <class 'myproject.myapp.models.myfile.QuerySet'>: it's not the same object as myproject.myapp.models.myfile.QuerySet
Run Code Online (Sandbox Code Playgroud)

奇怪的是(或者可能不那么奇怪),当我cPcikle从另一个方法或视图调用时,我只会得到那个错误,但是当我从命令行调用它时却没有.

我在阅读了PicklingError之后做了下面的方法:不能pickle <class'minimal.Decimal'>:它与decimal.DecimalDjango mod_wsgi在保存对象时不是同一个对象:

def dump_queryset(queryset, model):
    from segment.segmentengine.models.segment import QuerySet
    memo = {}
    new_queryset = deepcopy(queryset, memo)
    memo = {}
    new_query = deepcopy(new_queryset.query, memo)
    queryset = QuerySet(model=model, query=new_query)    
    return cPickle.dumps(queryset.query)
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我变得非常绝望 - 该方法仍会产生相同的错误.是否有一个已知的,非hacky解决这个问题的方法?

编辑:尝试使用--noreloaddjango开发服务器上的运行,但无济于事.

编辑2:我在上面显示的错误中输了一个错误 - 它models.QuerySet不是models.mymodel.QuerySet在抱怨.这里还有另一个细微差别,就是我的模型文件分为多个模块,因此错误实际上是:

 Can't pickle <class 'myproject.myapp.models.myfile.QuerySet'>: it's not the same object as myproject.myapp.models.myfile.QuerySet
Run Code Online (Sandbox Code Playgroud)

其中myfile是模型下的模块之一.我有一个__ini__.py带有以下行的模型:

from myfile import *
Run Code Online (Sandbox Code Playgroud)

我想知道这是否有助于我的问题.有没有办法改变我init以保护自己免受这种伤害?还有其他测试吗?

编辑方式3:这里有一个关于我的用例的更多背景:我有一个模型叫做Context我用来填充UI元素的实例mymodel.用户可以在UI端添加/删除/操作对象,更改其上下文,当他们返回时,他们可以保留他们的更改,因为上下文序列化了所有内容.上下文具有用于操作对象的不同类型的过滤器/方式的通用外键,所有这些都必须实现上下文用于确定应显示的内容的一些方法.一个这样的过滤器采用可以传入的查询集并显示该查询集中的所有对象.这提供了一种传递在其他地方生成的任意查询集并将它们显示在UI元素中的方法.使用Context的模型是分层的(对此使用mptt),并且UI元素在每次用户点击时发出请求以获取子项,然后我们可以带孩子并根据是否应该根据是否显示它们来显示它们包含在上下文中.希望有所帮助!

EDIT4:我能够转储一个空的查询集,但是只要我添加任何有价值的东西,就会失败.

编辑4:我在Django 1.2.3上

小智 6

这可能不是每个人的情况,但我使用的是 Ipython notebook 并且在我自己的课程中遇到了类似的问题。问题原来是来自重新加载调用

from dir.my_module import my_class    
reload(dir.my_module)
Run Code Online (Sandbox Code Playgroud)

删除重新加载调用,然后重新运行导入和创建该对象实例的单元格,然后允许它被腌制。


luc*_*mia 0

根据这个文档,pickle QuerySet 应该不是问题。因此,问题应该来自其他地方。

既然你提到了:

EDIT2:我在上面显示的错误中出现了拼写错误——它抱怨的是 models.QuerySet,而不是 models.mymodel.QuerySet。这里还有另一个细微差别,那就是我的模型文件被分成多个模块,所以错误实际上是:

  1. 您提供的第二条错误消息看起来与上一条相同,是您的意思吗?
  2. 您提供的错误消息看起来很奇怪。由于您正在酸洗“queryset.query”,因此错误应该与 django.db.models.sql.Query 类而不是 QuerySet 类相关。

某些模块或类可能具有相同的名称。它们会互相覆盖然后导致此类问题。为了让事情变得更简单,我建议您使用“import ooo.xxx”而不是“from ooo import *”。