боялся «не та же ошибка объекта», выбирая объект queryset.query

У меня есть запрос, который мне нужно лениво рассолить, и у меня серьезные проблемы. неприятности. cPickle.dumps (queryset.query) выдает следующую ошибку:

Can't pickle : it's not the same object as myproject.myapp.models.myfile.QuerySet

Как ни странно (или, возможно, не так уж странно), я получаю эту ошибку только при вызове cPcikle из другого метода или представление, но не когда я вызываю его из командной строки.

Я создал метод ниже после прочтения PicklingError: Can't pickle :это не тот же объект, что и 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, но безрезультатно.

РЕДАКТИРОВАТЬ2: У меня была опечатка в показанной выше ошибке - - он жаловался на models.QuerySet , а не на models.mymodel.QuerySet . Здесь есть еще один нюанс: мой файл моделей разбит на несколько модулей, поэтому ДЕЙСТВИТЕЛЬНО возникает ошибка:

 Can't pickle : it's 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

23
задан Community 23 May 2017 в 10:32
поделиться