PickledObjectField(django-picklefield)的使用示例?
在网上冲浪的时候,我看到关于Django开发最佳实践的内容,提到使用Pickled模型字段时要非常小心。
但是在实际生活中,PickledObjectField
通常用来解决什么具体问题呢?
4 个回答
你可以用它来存储... 几乎任何类型的Python对象。不过一般来说,使用它的理由不多;因为JSON更安全,而且更容易在不同的地方使用。
你可以用JSON和一些额外的逻辑来替代PickledObjectField,从JSON中创建一个对象。简单来说,你使用PickledObjectField或者JSON加逻辑,最终都是为了把一个Python对象存储到数据库里。如果你信任Python对象里的数据,并且知道它总是可以被序列化(转化成可以存储的格式),那么使用PickledObjectField是合理的。在我的情况中(我不使用Django的ORM,但这个道理还是适用的),我有几种不同类型的对象可以放进PickledObjectField,而且它们的定义一直在变化。与其不断更新我的JSON解析逻辑来从JSON值创建对象,我干脆使用PickledObjectField来存储这些不同的对象,然后再以可用的形式取出来(调用它们的函数)。需要注意的是:如果你通过PickledObjectField存储了一个对象,然后你改变了这个对象的定义,再去取出这个对象,旧的对象可能会在新的定义中出现问题(这取决于你改了什么)。
我们有一个社交网络的“后端”系统,这些后端做一些通用的事情,比如“发布消息”、“获取状态”、“获取朋友”等等。每个后端类和用户之间的联系是通过django模型来实现的,这个模型保存了用户信息、后端名称和凭证。现在想象一下,有多少种认证系统:oauth、普通密码、Facebook那种复杂的js东西等等。在这种情况下,JSONField就派上用场了,我们可以在这个模型中用字典来保存所有特定于后端的认证数据,这些数据会以json格式存储在数据库中,我们可以随意放入任何内容,毫无问题。