страшно "не та же самая ошибка объекта", выбирающая объект queryset.query - PullRequest
22 голосов
/ 17 июля 2011

У меня есть набор запросов, который мне нужно лениво травить, и у меня серьезные проблемы. 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

Ответы [ 4 ]

4 голосов
/ 12 февраля 2016

Это может быть не для всех, но я использовал ноутбук Ipython и у меня возникла похожая проблема, когда я выбрал свой собственный класс.Проблема оказалась из вызова перезагрузки

from dir.my_module import my_class    
reload(dir.my_module)

Удаление вызова перезагрузки с последующим повторным запуском импорта и ячейка, в которой был создан экземпляр этого объекта, затем позволила его засечь.

1 голос
/ 25 июля 2011

не так элегантно, но, возможно, это работает: добавьте каталог myfile -модуля к os.sys.path и используйте только import myfile в каждом модуле, где вы используете myfile. (удалите все from segment.segmentengine.models.segment import в любом месте вашего проекта)

0 голосов
/ 24 июля 2011

Вы также можете попробовать

import ooo.xxx as othername
0 голосов
/ 21 июля 2011

Согласно этому документу , выбор QuerySet не должен быть проблемой. Таким образом, проблема должна исходить из другого места.

С тех пор, как вы собрали:

EDIT2: У меня была ошибка в отображаемой выше ошибке - это были models.QuerySet, а не models.mymodel.QuerySet, на который она жаловалась. Здесь есть еще один нюанс: файл моих моделей разбит на несколько модулей, поэтому ошибка АКТУАЛЬНО:

  1. Второе сообщение об ошибке, которое вы предоставили, выглядит так же, как и предыдущее, вы это имеете в виду?
  2. Сообщение об ошибке, которое вы предоставили, выглядит странно. Поскольку вы выбираете «queryset.query», ошибка должна относиться к классу django.db.models.sql.Query вместо класса QuerySet.

Некоторые модули или классы могут иметь одинаковые имена. Они переопределят друг друга, а затем станут причиной такого рода проблем. Чтобы упростить задачу, я рекомендую вам использовать «import ooo.xxx» вместо «from ooo import *».

...