2010-03-15 15 views
4

我的应用使用“每用户会话”来允许来自同一用户的多个会话共享状态。它通过酸洗对象与django会话非常类似。如何为django模型对象自定义pickle

我需要腌制一个指向django模型对象的复杂对象。标准酸洗过程在酸菜中存储非规格化对象。因此,如果对象在酸洗和取消打印之间发生更改,则该模型现在已过时。 (我知道这对于内存中的对象也是如此,但酸洗对于解决这个问题是一个方便的时间。)

显然,将这​​个复合体存储在数据库中会更干净,但这不实用。随着项目的发展,它的代码必然会迅速变化。每次对象的数据模型更改时必须更新数据库模式会使项目速度下降很多。

所以我想要的是一种不腌制完整的django模型对象的方法。相反,只需存储其类和id,并在加载时从数据库中重新获取内容。我可以为这个类指定一个自定义的pickle方法吗?如果有办法进行酸洗,我很乐意在django模型中编写一个包装类来处理来自数据库的延迟读取。

+0

为什么你想用'pickle'来保存你的数据?你能提供更多细节吗?这听起来像你可能会更好地将数据保存在db – Zach 2010-03-15 15:03:33

+0

是的,将它存储在数据库中会更干净,但这不切实际。我保存的对象非常复杂,随着项目的发展必然会迅速发生变化。每次更改有关该对象存储的内容时都必须更新数据库模式,从而导致项目停止。 – muudscope 2010-03-15 15:22:11

+0

请用更多的事实更新你的问题。你拥有这个问题;你并不局限于将评论串在一起。请更新问题。请解释为什么JSON不适合您的问题。 – 2010-03-15 15:37:19

回答

1

目前尚不清楚你的目标是什么。 “但是,如果我只是将id和class存储在一个元组中,那么每次使用任何django对象时我都必须返回到数据库。我希望能够保留这些对象, m在页面请求过程中在内存中使用。“

这没有意义,因为视图函数的一个页面请求,并且在视图函数中有局部变量可以保持对象的位置,直到完成为止。

此外,Django的ORM基于缓存。

最后,Django提供的会话是请求之间“内存中对象”的通常位置。

你不应该腌任何东西。

+0

嗯。没有想过ORM缓存。如果我只是使用id/class元组方法,那对我来说可能就够了。 我需要为会话做相同的原因,但内置会话的作用域太紧 - 我有一个“用户范围”会话,而不是浏览器范围的会话。 由于封装的原因,在view方法中加载这些对象没有任何意义。 无论如何,谢谢你的建议。 – muudscope 2010-03-15 15:56:12

+0

什么是“用户范围”会话?请更新你的问题来解释你在做什么。在视图函数中如何做到这一点没有意义?这是一个页面请求**是**。 – 2010-03-15 15:58:48

0

您可以重载序列化方法。但将id和class放在一个元组或字典中并将其浸泡就更简单了。

+0

但是,如果我只是将id和class存储在一个元组中,那么每次使用任何django对象时我都必须返回到数据库。我希望能够在页面请求过程中保留我在内存中使用的内容。问题是如果我把它们放在记忆里,那么它们会被腌制。 如何重载序列化方法?在咸菜文档中我没有看到任何有关这方面的信息。 谢谢。 – muudscope 2010-03-15 15:25:00

+0

但为什么不缓存它们呢?这就是Django缓存的内容。 – Tom 2010-03-15 15:48:02

相关问题