PickledObjectField(django-picklefield)的使用示例?

时间:2010-03-25 04:16:10

标签: python django

在网上冲浪,阅读django dev best practices点以谨慎使用pickled model fields

但是在现实生活中的例子中,你会在哪里使用PickledObjectField来解决具体问题?

4 个答案:

答案 0 :(得分:4)

您绝对可以使用JSON替换PickledObjectField以及一些额外的逻辑来从JSON中创建对象。在一天结束时,您的用例在考虑使用PickledObjectField或JSON +逻辑时,会将Python对象序列化到您的数据库中。如果您可以信任Python对象中的数据,并且知道它始终是可序列化的,那么您可以合理地使用PickledObjectField。在我的情况下(我不使用django的ORM,但这应该仍然适用),我有几个不同的对象类型可以进入我的PickledObjectField,他们的定义不断变化。我不是不断更新我的JSON解析逻辑以使用JSON值创建对象,而是简单地使用PickledObjectField来存储不同的对象,然后以完全可用的形式(调用它们的函数)检索它们。警告:如果您通过PickledObjectField存储对象,然后更改对象定义,然后检索对象,旧对象可能无法适应新对象的定义(取决于您更改的内容)。

答案 1 :(得分:3)

你会用它来存储...... almost-arbitrary Python objects。一般来说,没有理由使用它; JSON更安全,更便携。

答案 2 :(得分:3)

我们有一个社交网络“后端”系统,它做一些通用的东西,如“发布消息”,“获取状态”,“获取朋友”等。每个后端类和用户之间的链接是django模型,它保持用户,后端名称和凭据。现在想象有多少auth系统:oauth,普通密码,facebook晦涩的js东西等。这是JSONField闪耀的地方,我们将所有后端特定的auth数据保存在这个模型的字典中,它作为json存储在db中,我们可以把任何东西都放进去没问题。

答案 3 :(得分:2)

要解决的问题是效率方便性定义和处理由多个部分组成的复杂对象

您可以将每个零件类型转换为模型,并通过ForeignKeys连接它们。 或者你可以根据自己的喜好将每个部分类型转换成类,字典,列表,元组,枚举或者什么,并使用PickledObjectField一步一步地存储和检索整个野兽。

如果您永远不会单独操作零件,只有复杂的对象作为一个整体,那么这种方法才有意义

现实生活中的例子

在我的应用程序中有 RQdef 对象,它们基本上代表了具有某种基本结构的类型(如果你很好奇它们是什么意思,看看here)。

  • RQdefs 包含多个 Aspects 和一些固定属性。
  • 方面由一个或多个 Facets 和一些固定属性组成。
  • Facets 包含两个或更多级别和一些固定属性。
  • 级别包含一些固定属性。
  • 总的来说,典型的 RQdef 将有大约20-40个零件。
  • RQdef 在存储到数据库之前总是在一个步骤中完全构造,从此永远不会被修改,只能读取(但经常阅读)。
对于此目的,

PickledObjectField比为每个 RQdef 设置的四个模型和20-40个对象更方便,更有效。