【问题标题】:How to customize pickle for django model objects如何为 django 模型对象自定义泡菜
【发布时间】:2011-01-27 17:29:46
【问题描述】:

我的应用使用“每用户会话”来允许来自同一用户的多个会话共享状态。它通过酸洗对象的操作与 django 会话非常相似。

我需要腌制一个引用 django 模型对象的复杂对象。标准酸洗过程将非规范化对象存储在泡菜中。因此,如果数据库中的对象在酸洗和解酸之间发生变化,那么模型现在已经过时了。 (我知道内存中的对象也是如此,但酸洗是解决它的方便时间。)

显然,将这​​个复杂的数据存储在数据库中会更简洁,但这并不实用。随着项目的发展,它的代码必然会迅速变化。每次对象的数据模型更改时都必须更新数据库架构会大大降低项目速度。

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

【问题讨论】:

  • 为什么要使用pickle 来保存数据?你能提供更多细节吗?在我看来,您最好将数据保存在数据库中
  • 是的,将其存储在数据库中会更干净,但这并不实用。我要保存的对象非常复杂,并且随着项目的发展必然会迅速变化。每次我更改此对象存储的任何内容时都必须更新数据库架构,这会使项目陷入停顿。
  • 请用其他事实更新您的问题。你拥有这个问题;您不仅限于将 cmets 串在一起。请更新问题。请解释为什么 JSON 不适合您的问题。

标签: python django pickle


【解决方案1】:

不清楚你的目标是什么。

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

这没有任何意义,因为视图函数一个页面请求,并且您的视图函数中有局部变量,可以在完成之前保留您的对象。

此外,Django 的 ORM 有一个缓存。

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

你不需要腌制任何东西。

【讨论】:

  • 嗯。没想到ORM缓存。如果我只使用 id/class tuple 方法,这对我来说可能已经足够了。出于与会话相同的原因,我需要进行腌制,但内置会话的范围太窄——我有一个“用户范围”的会话,而不是浏览器范围的会话。出于封装的原因,在视图方法中加载这些对象没有任何意义。不管怎样,谢谢你的建议。
  • 什么是“用户范围”会话?请更新您的问题以解释您在做什么。在视图函数中这样做怎么可能没有意义?这就是页面请求
【解决方案2】:

您可以重载序列化方法。但是将 id 和 class 放在元组或 dict 中并腌制会更简单。

【讨论】:

  • 但是,如果我只是将 id 和 class 存储在一个元组中,那么每次我使用任何 django 对象时,我都必须返回数据库。我希望能够在页面请求过程中将我正在使用的那些保留在内存中。问题是如果我把它们放在内存中,那么它们就会被腌制。如何重载序列化方法?我在泡菜文档中没有看到任何关于此的内容。谢谢。
  • 但是为什么不缓存它们呢?这就是 Django 的缓存。
猜你喜欢
  • 1970-01-01
  • 2019-08-07
  • 2012-07-06
  • 1970-01-01
  • 2021-09-30
  • 2012-06-06
  • 2022-11-28
  • 2011-10-17
  • 2015-03-23
相关资源
最近更新 更多