跳转到主要内容

Django的pickle对象字段

项目描述

django-picklefield

License Latest Version Build Status Coverage Status Supported Python Versions Wheel Status

关于

django-picklefield提供了一个pickle对象字段的实现。此类字段可以包含任何可pickle的对象。

该实现借鉴并采用了 Taavi Taijala 的 Django 插件 #1694,它基于 Oliver Beattie 的 Django 插件 #513。

django-picklefield 采用 MIT 许可证。

用法

首先,您需要安装 django-picklefield;为了方便,您可以从 PyPI 获取最新版本。

使用时,只需在您的模型中定义一个字段

>>> from picklefield.fields import PickledObjectField
... class SomeObject(models.Model):
...     args = PickledObjectField()

并将您喜欢的任何内容(只要它是可序列化的)分配给该字段

>>> obj = SomeObject()
>>> obj.args = ['fancy', {'objects': 'inside'}]
>>> obj.save()

注意事项

如果您需要将具有 PickledObjectField 的对象序列化以传输到浏览器,您可能需要子类化该字段并重写 value_to_string() 方法。目前,pickle 字段以 base64 编码的 pickle 格式序列化,这允许可靠的反序列化,但这种格式在浏览器中解析并不方便。通过重写 value_to_string(),您可以选择更方便的序列化格式。

字段现在接受布尔关键字参数 copy,默认为 Truecopy 对于正确执行查找是必要的。如果您不关心在 picklefield 上执行查找,可以将 copy=False 设置为节省一些内存使用。这对于非常大的对象树特别有益。

运行测试

可以使用 Tox 运行完整的测试套件。

>>> pip install tox
>>> tox

原始笔记

以下是原始作者 taavi223 的笔记

当没有合适的字段时,对于存储几乎任何东西(当然前提是可以 Pickle 化)非常有用。

PickledObjectField 是数据库无关的,应该与您可以抛给它的任何数据库后端一起使用。您可以传入任何 Python 对象,它将在后台自动转换为 Pickle 格式。您永远不需要手动 Pickle 或 Unpickle 任何东西。在查询时也表现良好;支持精确、in 和 isnull 查找。但是请注意,调用 QuerySet.values() 只会返回编码后的数据,而不是原始的 Python 对象。

这个 PickledObjectField 在插件 #513 的基础上做了一些改进。

它通过将 pickle 输出流进行 base64 编码解决了保存包含非 ASCII 数据的对象时出现的 DjangoUnicodeDecodeError 问题。这确保所有存储的数据都是 ASCII,消除了问题。

PickledObjectField 现在可以选择性地使用 zlib 在线压缩(和解压缩)pickle 对象。这可以通过使用关键字参数“compress=True”按字段设置。对于大多数项目来说,这可能不值得承担微小的性能损失,但对于具有较大对象的模型来说,它可以节省大量空间。

您还可以使用关键字参数“protocol”指定每个字段的 pickle 协议。默认值为 2,它应该始终有效,除非您试图从 Django ORM 外部访问数据。

解决了使用 cPickle 和对复杂数据类型执行查找时出现的一个罕见问题。简而言之,cPickle 有时会根据引用方式输出不同的流,对于相同的对象。这当然可能导致对复杂数据的查找失败,即使存在匹配的对象。有关更多信息,请参阅文档字符串和测试。

您现在可以使用 isnull 查找并按预期执行。结果是,默认情况下,PickledObjectField 将 null=True 设置为 true(当然,如果您想更改这一点,可以传递 null=False)。如果设置为 null=False(字段的默认值),则无法存储 Python None 值,因为 None 值不会被 Pickle 或编码(这反过来使得 isnull 查找成为可能)。

您现在可以将对象作为字段的默认参数传入,而无需先将其转换为 Unicode 字符串。但是,如果您传入一个可调用对象,字段仍会调用它。它不会尝试 Pickle 或编码它。

您可以从fields.py中手动导入dbsafe_encode和dbsafe_decode,如果您想自己编码和解码对象。这主要用于解码通过调用QuerySet.values()返回的值,这些值仍然是编码后的字符串。

注意:如果您尝试在PickledObjectField中存储其他django模型,请参阅相关注释,以讨论与这样做相关的问题。简单的解决方案是在将它们分配给PickledObjectField之前将django模型放入列表或元组中。

更新时间:2009年9月2日:修复了value_to_string方法,现在序列化应该按预期工作。此外,将deepcopy重新添加到dbsafe_encode中,修复了上述问题4,因为deepcopy不知何故自行移除。这意味着在所有情况下查找都应该再次按预期工作。此外,默认将字段设为不可编辑(我发誓我之前已经这样做过!)因为让PickledObjectField可由用户编辑从来都不是一个好主意。

更改

3.2.0版本中的更改

  • 增加了对Django 4.1、4.2和5.0的测试支持。

  • 增加了对Python 3.11和3.12的测试支持。

  • 停止支持Python 3.6和3.7。

3.1.0版本中的更改

  • 增加了对Django 3.2和4.0的测试支持。

3.0.1版本中的更改

  • 无;解决了3.0.0版本中的打包问题

3.0.0版本中的更改

  • 允许使用PICKLEFIELD_DEFAULT_PROTOCOL设置覆盖默认pickle协议。

  • 停止支持Python 2。

  • 增加了对Django 3.0的测试。

  • 停止支持Django 1.11。

2.1.0版本中的更改

  • 添加了对Django 2.2的官方支持(感谢joehybird)。

  • 停止支持Django 2.0和2.1(感谢joehybird)。

  • 停止支持Python 3.4(感谢joehybidd)。

2.0.0版本中的更改

  • 在Django 2.0+上关闭了RemovedInDjango30Warning警告(感谢canarduck)。

  • 重构了项目目录。

  • 不允许使用空字符串为PickledObjectField赋值。这会使.save().create()等在未指定默认值(如内置字段所做的那样)且null不为真时引发IntegrityError(感谢Attila-Mihaly Balazs)。

  • PickledObjectField添加了对可变默认值的检查。

1.1.0版本中的更改

  • 增加了对Django 2.1的支持,并停止支持Django < 1.11。

1.0.0版本中的更改

  • 增加了一个新选项,以防止在序列化之前复制对象:copy=True

  • 停止支持Django 1.4

  • 停止支持Django 1.7

  • 停止支持Python 3.2

  • 增加了对Python 3.6的支持

0.3.2版本中的更改

  • 停止支持Django 1.3。

  • 停止支持Python 2.5。

  • 在Django 1.8+上关闭了弃用警告。

0.3.1版本中的更改

  • 优先使用内置的json模块(感谢Simon Charette)。

0.3.0版本中的更改

  • Python 3支持(感谢Rafal Stozek)。

0.2.0版本中的更改

  • 允许序列化django.db.models.Model的子类(感谢Simon Charette)。

0.1.9版本中的更改

  • connectionprepared参数添加到get_db_prep_value()中(感谢Matthew Schinckel)。

0.1.8版本中的更改

  • 更新了代码仓库的链接。

0.1.7版本中的更改

  • connectionprepared参数添加到get_db_prep_lookup()中,以消除Django 1.2中的弃用警告。

0.1.6版本中的更改

0.1.5版本中的更改

  • 增加了对South的支持。

  • 将默认值更改为null=False,如Django中常见的那样。

0.1.4版本中的更改

  • 更新了版权声明。

0.1.3版本中的更改

  • 更新序列化测试(感谢Michael Fladischer)。

版本0.1.2的更改

  • 添加了简化版BSD许可。

版本0.1.1的更改

  • 添加了序列化测试。

  • 添加了关于浏览器中JSON序列化的说明。

  • 添加了对不同pickle协议版本的支持(感谢Michael Fladischer)。

版本0.1的更改

  • 首次公开发布。

反馈

有关如何访问代码存储库的说明可在以下主页 <http://github.com/gintas/django-picklefield>。

请将反馈和建议发送至 gintautas@miliauskas.lt .

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源分发

django-picklefield-3.2.tar.gz (9.5 kB 查看哈希)

上传时间

构建分发

django_picklefield-3.2-py3-none-any.whl (9.5 kB 查看哈希)

上传时间 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面