Как настроить pickle для объектов модели Django - PullRequest
4 голосов
/ 15 марта 2010

Мое приложение использует «сеанс для каждого пользователя», чтобы разрешить нескольким сеансам от одного пользователя совместно использовать состояние. Он работает очень похоже на сессию Django, выбирая объекты.

Мне нужно выбрать сложный объект, который ссылается на объекты модели Django. Стандартный процесс травления сохраняет денормализованный объект в травлении. Таким образом, если объект изменяется в базе данных между травлением и снятием травления, модель устарела. (Я знаю, что это верно и для объектов в памяти, но травление - удобное время для решения этой проблемы.)

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

Так что мне бы хотелось, чтобы не был засолен полный объект модели django. Вместо этого просто сохраните его класс и идентификатор и повторно загрузите содержимое из базы данных при загрузке. Могу ли я указать собственный метод pickle для этого класса? Я рад написать класс-оболочку для модели django, чтобы обрабатывать ленивую выборку из базы данных, если есть способ сделать засолку.

Ответы [ 2 ]

1 голос
/ 15 марта 2010

Неясно, какова ваша цель.

"Но если я просто сохраню идентификатор и класс в кортеже, я обязательно вернусь к базе данных каждый раз, когда использую любой из объектов django. Я бы хотел иметь возможность сохранить те, которые я используется в памяти в течение запроса страницы. "

Это не имеет смысла, так как функция просмотра является запросом страницы, и в вашей функции просмотра есть локальные переменные, которые сохраняют ваши объекты, пока вы не закончите.

Далее, в ORM Джанго есть кеш.

Наконец, предоставляемый Django сеанс является обычным местом для «объектов в памяти» между запросами.

Тебе не нужно ничего мариновать.

0 голосов
/ 15 марта 2010

Вы можете перегрузить методы сериализации. Но было бы проще поместить идентификатор и класс в кортеж или диктовку и засолить это.

...