跳转到主要内容

为django模型提供JSONField

项目描述

维护模式仅限: 建议不要在新的项目中使用此库。Django 3.1包括一个跨数据库的JSONField实现 - 请参阅其发布说明。您可以使用该字段在较旧的Django版本上使用django-jsonfield-backport包。有关更多信息,请参阅下面的(长)历史部分。

命名说明: 此项目以django-jsonfield的名称发布在Pypi上。它不应与Pypi包jsonfield混淆,该包也被称为django-jsonfield。


为Django模型提供跨数据库JSON字段。

历史

该项目于2010年由Matthew Schinckel创建。他基于David Cramer的博客代码创建,该博客地址为https://web.archive.org/web/20140731084522/http://cramer.io/2009/04/14/cleaning-up-with-json-and-sql/,仓库位于BitBucket上,并于2018年前维护它。2019年3月,Adam Johnson接管了维护工作(自2018年的邀请以来!),并将其移至GitHub上的Git,因为他对Mercurial不熟悉,而“每个人”现在都在使用GitHub。

当时,Django支持的数据库没有原生JSON支持。从那时起,它们中的大多数都获得了这种能力。相应地,有一些Django字段实现是为了利用这一能力

  • PostgreSQL的django.contrib.postgres中提供的JSONField,它是Django 1.9版本的一部分,于2015年12月发布。请注意,此库会干扰工作方式,有关解释和解决方案,请参阅问题5

  • 自2016年3月发布的1.0.7版本以来,Django-MySQL中提供了MySQL(可能还包括MariaDB)的JSONField

2020年8月发布的Django 3.1包括了一个跨数据库的JSONField作为其主要特性之一(发布说明)。此包背后的开发者Sage Abdullah还发布了Django 3.1的代码,在包django-jsonfield-backport中。

建议您使用Django 3.1或django-jsonfield-backport,而不是此包。

或者,如果您不需要在数据库中查询JSON内容的能力,考虑将JSON存储在TextField中,并在您的代码中适当地反序列化它,也许可以在模型类上使用一个@property来代理它。

安装

使用

pip安装

pip install django-jsonfield

然后在您的模型中使用该字段

from django.db import models
import jsonfield

class MyModel(models.Model):
    the_json = jsonfield.JSONField()

您可以为此字段分配任何可JSON编码的对象。在将其作为文本值存储在数据库之前,它将被JSON编码,并在从数据库检索时将其转换回Python列表/字典/字符串。

还有一个TypedJSONField,允许您定义必须在数组中的每个对象中包含的数据类型。更多文档将随后提供。

注意

如果没有提供default,并且没有将null=True传递给字段构造函数,则将使用默认值{}

支持的Django版本

已测试从1.8版以来的所有Django版本。

附加功能

jsonify模板标签

这允许您在模板中将Python数据结构转换为JSON

{% load jsonify %}

<script>
var foo = {{ bar|jsonify|safe }};
</script>

请注意,当您在

<script>标签(类似于CDATA部分)中使用jsonify过滤器时,必须仅使用“safe”过滤器。

如果您在其他地方使用它,例如在HTML属性中,那么您必须不使用safe过滤器,以便其输出被正确转义

<div data-foo="{{ bar|jsonify }}">

上述规则非常重要,可以避免使用在转换后的数据结构中存储的不安全字符串进行XSS攻击。

贡献

如果您想为django-jsonfield做出贡献,运行测试套件将帮助您。这可以通过以下最简单的方式完成:

DB_ENGINE=sqlite3 DB_NAME=tests ./tests.py

要完整运行测试,您需要安装tox。

历史

1.4.0 (2019-12-18)

  • Django 3.0兼容性。这需要添加six作为依赖项。

1.3.1 (2019-08-19)

  • 从1.3.0版本变更中修复Python 2兼容性(PR #16)。

1.3.0 (2019-08-18)

  • django.contrib.postgres.fields.JSONField 并行工作,通过移除默认 JSONB 函数的注册,并在 SQL 中使用 Postgres 的 cast-to-text(PR #14)。

    这将允许您迁移到更好支持的 django.contrib.postgres.fields.JSONField,然后是 Django 3.0 的即将到来的全数据库 JSONField

1.2.0 (2019-04-28)

  • 已在 Django 2.2 上进行测试。

  • 在 Django 2.0+ 上停止“RemovedInDjango30Warning: 从 JSONField.from_db_value() 中移除上下文参数”。

1.1.0 (2019-03-16)

Django 1.10 支持:注册显式查找运算符。

Django 1.11 支持:更新小部件的 render() 方法。

1.0.1 (2016-07-21)

修复了与 Postgres JSONB 字段的兼容性问题。

使用 jsonify 模板标签限制 XSS 攻击。

1.0.0 (2016-06-02)

添加对 Django 1.8 和 1.9 的支持(无警告)。移除对 Django < 1.8 的支持,因为这些版本 upstream 本来就不受支持。

在此版本中,JSONField 不再将分配的字符串值解码为 JSON。相反,它假设您分配的任何值都是解码的值,该值在存储到数据库之前将被 JSON 编码。这解释了版本号升到 1.0,因为这是一个向后不兼容的更改。

0.9.19 (2016-02-22)

允许将 decoder_kwargs 作为参数传递给字段。当加载字符串数据时,此字典将作为 kwargs 传递给 json.loads() 调用。

您也可以在 settings.JSONFIELD_DECODER_KWARGS 中将其设置为全局值。

为每个字段创建一个新的字典:因此,如果在字段定义之后更改此值,它不应影响已附加的字段。

0.9.16

允许将 encoder_class 参数传递给字段,这将导致使用该对象(或位于该路径的对象,例如 core.utils.JSONEncoder)作为序列化对象时使用的 cls 参数。

您也可以在 settings.JSONFIELD_ENCODER_CLASS 中将其设置为全局值。

0.9.15

提升版本号以解决上传问题。

0.9.14

不再击中数据库以确定 db_type。

0.9.12

缓存 db_type 的结果。更好地处理来自多个选择小部件的传入数据。

0.9.9

最后删除非必需文件。

0.9.8

移除 freezegun 的工作区。修复损坏的构建。

0.9.4

修复可变默认值的更改:在这种情况下,我们将序列化和反序列化,因此您仍然可以使用 default={}

0.9.3

移除使用 Postgres 9.2 的 JSON 数据类型存储数据的支持,因为您现在无法查询此数据类型!

移除对 django < 1.3 的支持。

0.9.0

添加 LICENSE 文件。添加了 TypedJSONField。

0.8.10

允许 {{ variable|jsonify }} 与查询集一起工作。

0.8.8

防止 django 1.3.1 和 gargoyle 之间的循环导入问题。

0.8.7

更好地处理 null=True 和 blank=True:现在应该清楚它们的作用。

0.8.5

允许使用 “{}” 和 “[]”,并使它们看起来不是 None。

0.8.4

确保版本号文件与包一起安装。

0.8.3

现在只在一个地方存储版本号。

0.8.2

哎呀。打包错误阻止了从 pypi 安装。将 README.rst 添加到清单中。

0.8.1

转换为字符串没有任何作用,因为使用 JSONField 将模型实例序列化会得到该字段的字符串版本,而不是内嵌的版本。(回到 0.8 之前的行为)。

添加了更好的查询支持:(field__contains={'key':'value','key2':'value2'} 适用于。)

从包中删除了 JSONTableWidget。

0.8

(非常感谢 IanLewis 提供这些功能)

支持 django 1.2

支持将可调用和可 JSON 序列化的对象用作默认值

实现了 get_db_prep_value()

添加测试和测试运行器。

从 README 中删除 JSONTableWidget。

0.7.1

在 django 安装之前尝试安装时不会失败。

0.7

第一个标记版本。

项目详细信息


下载文件

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

源代码分发

django-jsonfield-1.4.1.tar.gz (13.6 kB 查看哈希值)

上传时间 源代码

构建分发

django_jsonfield-1.4.1-py2.py3-none-any.whl (14.7 kB 查看哈希值)

上传时间 Python 2 Python 3

支持者

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