Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何自定义django模型对象的pickle_Python_Django_Pickle - Fatal编程技术网

Python 如何自定义django模型对象的pickle

Python 如何自定义django模型对象的pickle,python,django,pickle,Python,Django,Pickle,我的应用程序使用“每用户会话”允许来自同一用户的多个会话共享状态。它的操作非常类似于django会话,通过pickle对象进行操作 我需要pickle一个引用django模型对象的复杂对象。标准的pickle过程在pickle中存储一个非规范化的对象。因此,如果数据库中的对象在pickle和unpickle之间发生更改,则模型现在已过时。(我知道内存中的对象也是如此,但酸洗是解决这个问题的方便时机。) 显然,在数据库中存储这个复合体会更干净,但这并不实际。随着项目的发展,它的代码必然会快速变化。

我的应用程序使用“每用户会话”允许来自同一用户的多个会话共享状态。它的操作非常类似于django会话,通过pickle对象进行操作

我需要pickle一个引用django模型对象的复杂对象。标准的pickle过程在pickle中存储一个非规范化的对象。因此,如果数据库中的对象在pickle和unpickle之间发生更改,则模型现在已过时。(我知道内存中的对象也是如此,但酸洗是解决这个问题的方便时机。)

显然,在数据库中存储这个复合体会更干净,但这并不实际。随着项目的发展,它的代码必然会快速变化。每次对象的数据模型更改时都必须更新数据库模式,这将大大降低项目的速度


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

可以重载序列化方法。但将id和类放入元组或dict和pickle中会更简单。

不清楚您的目标是什么


“但是,如果我只是将id和类存储在元组中,那么每次使用django对象时,我都必须返回数据库。我希望能够在页面请求过程中将使用的对象保留在内存中。”

这是没有意义的,因为视图函数是一个页面请求,并且在视图函数中有一些局部变量,这些变量在完成之前一直保存对象

此外,Django的ORM是缓存

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


您不需要对任何内容进行pickle。

为什么要使用
pickle
保存数据?你能提供更多细节吗?在我看来,您最好将数据保存在数据库中。是的,将数据存储在数据库中会更干净,但这并不实际。我保存的对象非常复杂,随着项目的发展必然会快速变化。每次我更改此对象存储的内容时都必须更新数据库架构,这会使项目陷入停顿。请用其他事实更新您的问题。你拥有这个问题;你不局限于把评论串在一起。请更新问题。请解释为什么JSON不适合您的问题。但是如果我只是将id和类存储在元组中,那么每次使用django对象时,我都必须返回数据库。我希望能够在页面请求过程中将使用的内容保留在内存中。问题是如果我把它们放在记忆里,它们就会被腌制。如何重载序列化方法?我在pickle文档中没有看到这方面的任何内容。谢谢。但是为什么不把它们藏起来呢?这就是Django的缓存。没有考虑过ORM缓存。如果我只使用id/class tuple方法,这对我来说可能已经足够好了。出于与会话相同的原因,我需要pickle,但是内置会话的作用域太紧了——我有一个“用户作用域”会话,而不是浏览器作用域会话。出于封装的原因,在view方法中加载这些对象没有任何意义。无论如何,谢谢你的建议。什么是“用户范围”会话?请更新您的问题以解释您正在做什么。在视图函数中执行此操作怎么可能没有意义?这就是页面请求。