在动态创建的模型上使用 Django 的 memcache API

发布于 2024-09-03 16:42:24 字数 279 浏览 6 评论 0原文

所以我有一个创建动态模型的函数。我以与 AuditTrail 非常相似的方式完成此任务(请参阅 django wiki)。

代码示例在这里:

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

有什么办法我可以使动态生成的类可pickle吗?理想情况下,这不是一个疯狂的猴子补丁/黑客?

So I have a function which creates a dynamic model. I accomplish this in a way very similar to AuditTrail (see django wiki).

Sample of code is here:

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

Is there any way I can make a dynamically-generated class pickle-able? Ideally something thats not a crazy monkeypatch/hack?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

猫卆 2024-09-10 16:42:24

我知道 pickle 无法存储生成的类或动态类的问题。我通过将动态类型装配到模块字典中解决了这个问题,如下所示:

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

它距离干净或优雅的解决方案还很远,所以如果有人能想到一个对 django 更友好的解决方案为了实现这一目标,我洗耳恭听。然而,上面的代码确实有效。

I am aware of the problem where pickle can't store a generated or dynamic class. I solved this by rigging in my dynamic type into the modules dict like so:

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

It's FAR from a clean or elegant solution, so if someone can think of a more django-friendly way to make this happen, I am all ears. However, the above code does work.

何以心动 2024-09-10 16:42:24

之所以没有答案,是因为答案可能很黑客。我认为如果不知道接收端类的结构,如果没有某种黑客解决方案,你就无法在 Python 中解开一个对象。 pickle 不支持它的一个重要原因可能是因为它是将恶意代码引入应用程序的绝佳方式。

http://www.mofeel.net/871-comp-lang- python/2898.aspx 解释了为什么动态创建的类无法取消pickle。

在每种情况下,我要么只是使用 dict 方法序列化对象属性的字典,要么只是想出了一些糟糕的解决方法。我希望你能想出更好的东西。

祝你好运!

The reason there aren't answers for this is because the answer is likely hackish. I don't think you can unpickle an object in Python without knowing the structure of the class on the receiving end without some sort of hackish solution. A big reason pickle doesn't support it is probably because it's a fantastic way to introduce malicious code into your application.

http://www.mofeel.net/871-comp-lang-python/2898.aspx explains a bit why dynamically created classes can't be unpickled.

In every case, I've either just serialized a dictionary of the attributes of the object using the dict method, or just figured out some awful work around. I hope you come up with something better.

Good Luck!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文