У меня есть набор запросов, который мне нужно лениво травить, и у меня серьезные проблемы. 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
Странно (или, возможно, не так странно), я получаю эту ошибку, только когда вызываю cPcikle
из другого метода или представления, но не когда я вызываю ее из командной строки.
Я сделал описанный ниже метод после прочтения PicklingError: Не могу засолить : это не тот же объект, что и decimal.Decimal и Django mod_wsgi PicklingError при сохранении объекта :
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)
Как видите, я очень отчаялся - этот метод все еще выдает ту же ошибку. Есть ли известное, не взломанное решение этой проблемы?
РЕДАКТИРОВАТЬ: Пробовал с помощью --noreload
на сервере разработки django, но безрезультатно.
EDIT2: У меня была опечатка в ошибке, которую я отображал выше - это была 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
Где myfile - один из модулей в моделях. У меня __ini__.py
в моделях со следующей строкой:
from myfile import *
Интересно, не способствует ли это моей проблеме? Есть ли способ изменить мой init
, чтобы защитить себя от этого? Есть ли другие тесты, чтобы попробовать?
EDIT3: Вот еще немного предыстории моего варианта использования: у меня есть модель с именем Context
, которую я использую для заполнения элемента пользовательского интерфейса экземплярами mymodel
. Пользователь может добавлять / удалять / манипулировать объектами на стороне пользовательского интерфейса, изменяя их контекст, и когда они возвращаются, они могут сохранять свои изменения, потому что контекст сериализует все. Контекст имеет общий внешний ключ для различных типов фильтров / способов, которыми пользователь может манипулировать объектом, и все они должны реализовывать несколько методов, которые контекст использует для выяснения того, что он должен отображать. Один такой фильтр принимает набор запросов, который можно передать, и отображает все объекты в этом наборе запросов. Это позволяет передавать произвольные наборы запросов, созданные в другом месте, и отображать их в элементе пользовательского интерфейса. Модель, в которой используется контекст, является иерархической (для этого используется mptt), и элемент пользовательского интерфейса делает запрос на получение дочерних элементов каждый раз, когда пользователь щелкает по кнопке, мы можем затем взять дочерние элементы и определить, должны ли они отображаться, основываясь на том, следует или нет они включены в контекст. Надеюсь, это поможет!
EDIT4: Я могу вывести пустой набор запросов, но как только я добавляю что-то ценное, он не работает.
РЕДАКТИРОВАТЬ 4: Я на Django 1.2.3