如何为Django模型对象自定义pickle

4 投票
2 回答
2821 浏览
提问于 2025-04-15 20:27

我的应用程序使用“每个用户会话”来允许同一个用户有多个会话共享状态。它的工作方式和django的会话很相似,都是通过将对象进行序列化来实现的。

我需要序列化一个复杂的对象,这个对象里面引用了django的模型对象。标准的序列化过程会把一个去规范化的对象存储在序列化文件里。所以如果在序列化和反序列化之间,数据库里的对象发生了变化,那么模型就会变得过时。(我知道在内存中的对象也是这样,但序列化时处理这个问题比较方便。)

显然,把这个复杂对象存储在数据库里会更干净,但这样做不太实际。因为随着项目的发展,相关的代码会快速变化。如果每次对象的数据模型变化都要更新数据库的结构,那会让项目进展变得很慢。

所以我想要一种方法,不用序列化整个django模型对象。只需要存储它的类和ID,然后在加载时从数据库重新获取内容。我可以为这个类指定一个自定义的序列化方法吗?如果有办法进行序列化,我很乐意为django模型写一个包装类,以处理从数据库的懒加载。

2 个回答

0

你可以重载序列化的方法。不过,把ID和类放在一个元组或者字典里,然后用pickle来处理会更简单。

1

你的目标不太清楚。

“但是如果我只是把id和类存储在一个元组里,那每次使用django对象的时候就必须回去数据库。我希望能在页面请求的过程中把正在使用的对象保存在内存中。”

这听起来不太对,因为视图函数就是一个页面请求,而在你的视图函数里有局部变量,可以在你完成之前保留这些对象。

而且,Django的ORM(对象关系映射)有一个缓存机制。

最后,Django提供的会话功能是请求之间存放“内存对象”的常用地方。

你不需要对任何东西进行序列化处理。

撰写回答