У меня есть запрос, который мне нужно мариновать, и у меня возникают серьезные проблемы. cPickle.dumps(queryset.query)
выдает следующую ошибку:
Can't pickle <class 'myproject.myapp.models.myfile.QuerySet'>: it not the same object as myproject.myapp.models.myfile.QuerySet
Странно (или, возможно, не так странно), я получаю эту ошибку только при вызове cPcikle
из другого метода или представления, но не тогда, когда я вызываю его из командной строки.
Я сделал метод ниже, прочитав PicklingError: Невозможно pickle < class 'decimal.Decimal' > : это не тот же объект, что и 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)
Как вы можете видеть, я получаю очень отчаянный - этот метод по-прежнему дает ту же ошибку. Есть ли известное, не-хакерское решение этой проблемы?
EDIT: Пробовал использовать --noreload
на сервере разработки django, но безрезультатно.
EDIT2: У меня была опечатка в ошибке, которую я отобразил выше - это был models.QuerySet
, а не models.mymodel.QuerySet
, о котором он жаловался. Здесь есть еще один нюанс, который заключается в том, что файл моих моделей разбит на несколько модулей, поэтому ошибка имеет значение ACTUALLY:
Can't pickle <class 'myproject.myapp.models.myfile.QuerySet'>: it not the same object as myproject.myapp.models.myfile.QuerySet
Где myfile - один из модулей под моделями. У меня есть __ini__.py
в моделях со следующей строкой:
from myfile import *
Интересно, влияет ли это на мою проблему. Есть ли способ изменить мой init
, чтобы защитить себя от этого? Есть ли еще какие-нибудь тесты?
EDIT3: Ниже приведено несколько примеров моего использования: у меня есть модель под названием Context
, которую я использую для заполнения элемента интерфейса экземплярами mymodel
. Пользователь может добавлять/удалять/манипулировать объектами на стороне пользовательского интерфейса, изменять их контекст, а когда они возвращаются, они могут сохранять свои изменения, потому что контекст сериализовал все. Контекст имеет общий внешний ключ для разных типов фильтров/способов, которыми пользователь может манипулировать объектом, все из которых должны реализовывать несколько методов, которые контекст использует для определения того, что он должен отображать. Один из таких фильтров принимает запрос, который может быть передан и отображает все объекты в этом наборе запросов. Это позволяет передавать произвольные запросы, созданные в другом месте, и отображать их в элементе пользовательского интерфейса. Модель, использующая контекст, является иерархической (с использованием mptt для этого), а элемент пользовательского интерфейса делает запрос на получение дочерних элементов каждый раз, когда пользователь щелкает, мы можем потом взять детей и определить, должны ли они отображаться на основе того, они включены в контекст. Надеюсь, что это поможет!
EDIT4: Я могу сбрасывать пустой набор запросов, но как только я добавляю что-то полезное, он терпит неудачу.
EDIT4: Я на Django 1.2.3