在网上冲浪,阅读django dev best practices点以谨慎使用pickled model fields。
但是在现实生活中的例子中,你会在哪里使用PickledObjectField
来解决具体问题?
答案 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)。
PickledObjectField
比为每个 RQdef 设置的四个模型和20-40个对象更方便,更有效。