Использование memcache API в Django на динамически создаваемых моделях - PullRequest
4 голосов
/ 03 июня 2010

Итак, у меня есть функция, которая создает динамическую модель. Я выполняю это способом, очень похожим на AuditTrail (см. Django wiki).

Пример кода здесь:

https://gist.github.com/0212845ae00891efe555

Есть ли какой-нибудь способ, которым я могу сделать динамически генерируемый класс маринованным? В идеале что-то, что не сумасшедшая обезьяна / взлом?

Ответы [ 2 ]

1 голос
/ 13 июля 2010

Мне известно о проблеме, когда pickle не может сохранить сгенерированный или динамический класс. Я решил это, установив динамический тип в модули, например:

new_class = type(name, (models.Model,), attrs)
mod = sys.modules[new_class.__module__]
mod.__dict__[new_class.__name__] = new_class

Это FAR от чистого или элегантного решения, так что если кто-то может подумать о более благоприятном для django способе сделать это, я весь слух. Тем не менее, приведенный выше код работает.

0 голосов
/ 07 июля 2010

Причина, по которой нет ответов, заключается в том, что ответ, скорее всего, хакерский. Я не думаю, что вы можете распаковать объект в Python, не зная структуры класса на принимающей стороне, без какого-либо хакерского решения. Большая причина, почему Pickle не поддерживает это, вероятно, потому что это фантастический способ внедрения вредоносного кода в ваше приложение.

http://www.mofeel.net/871-comp-lang-python/2898.aspx немного объясняет, почему динамически созданные классы не могут быть выделены.

В каждом случае я либо просто сериализировал словарь атрибутов объекта, используя метод dict , либо просто придумал какую-то ужасную работу. Надеюсь, ты придумал что-нибудь получше.

Удачи!

...