带你尝鲜Django最新版重要更新JSONField的使用

Django最新版v3.1的主要更新之一便是完善了对JSON数据存储的支持,新增models.JSONFieldforms.JSONField,可在所有受支持的数据库后端上使用

目前支持的数据库以及对应版本主要有MariaDB 10.2.7+,MySQL 5.7.8+,Oracle,PostgreSQLSQLite 3.9.0+,但个别Django的查询方法可能与部分数据库不兼容,例如containscontained_by就不支持Oracle和SQLite数据库

JSONField使用

from django.db import modelsclass Hero(models.Model):name = models.CharField(max_length=200)data = models.JSONField(null=True)def __str__(self):return self.name

通过models.JSONField可指定此字段为存储类型为JSON格式。null=True表示此字段可以为空,这个NULL指的是SQL NULL,如果想存储为JsonNULL,则可以使用Value('null')来实现

Hero.objects.create(name='coffee', data=Value('null'))

SQL NULL与JsonNULL的区别主要在is_null的查询上不同,可以通过以下这个示例来理解下

>>> from django.db.models import Value
>>>
>>> Hero.objects.create(name='ops')
<Hero: ops>
>>> Hero.objects.create(name='coffee', data=Value('null'))
<Hero: coffee>
>>>
>>> Hero.objects.filter(data=None)
<QuerySet [<Hero: coffee>]>
>>> Hero.objects.filter(data=Value('null'))
<QuerySet [<Hero: coffee>]>
>>>
>>> Hero.objects.get(name='ops').data
>>> Hero.objects.get(name='coffee').data
>>>
>>> Hero.objects.filter(data__isnull=True)
<QuerySet [<Hero: ops>]>
>>> Hero.objects.filter(data__isnull=False)
<QuerySet [<Hero: coffee>]>

JSONField查询

Json字段的查询方法,通过下边这个示例演示说明

>>> Hero.objects.create(name='ops-coffee.cn', data={
...     'age': 12,
...     'group': {
...         'name': 'ow1',
...         'skill': [
...             {'name': 'swim', 'rank': 'A+'},
...             {'name': 'shot', 'rank': None}
...         ]
...     }
... })
<Hero: ops-coffee.cn>
>>> Hero.objects.create(name='ops-coffee', data={'age':16})
<Hero: ops-coffee>

当想要查询age12的数据时可以这样查询

>>> Hero.objects.filter(data__age=12)
<QuerySet [<Hero: ops-coffee.cn>]>

当想要查询groupnameow1的数据时可以这样查询

>>> Hero.objects.filter(data__group__name='ow1')
<QuerySet [<Hero: ops-coffee.cn>]>

当想要查询groupskill中第一个数据的name值为swim的数据时可以这样查询

>>> Hero.objects.filter(data__group__skill__0__name='swim')
<QuerySet [<Hero: ops-coffee.cn>]>

当想要查找包含group键的所有数据时,可以通过has_key来实现

>>> Hero.objects.filter(data__has_key='group')
<QuerySet [<Hero: ops-coffee.cn>]>

当想要查找同时包含group键和age键的所有数据时,可以通过has_keys来实现

>>> Hero.objects.filter(data__has_keys=['group','age'])
<QuerySet [<Hero: ops-coffee.cn>]>

当想要查找包含group键或者age键的所有数据时,可以通过has_any_keys来实现

>>> Hero.objects.filter(data__has_any_keys=['group','age'])
<QuerySet [<Hero: ops-coffee.cn>, <Hero: ops-coffee>]>

当想一次性查找包含age12groupnameow1的数据时,可以通过contains来实现

>>> Hero.objects.filter(data__contains={'age':12,'group': {'name': 'ow1'}})
<QuerySet [<Hero: ops-coffee.cn>]>

JSONField除了支持以上查询方式外,对于ORM所提供的大部分其他查询方式同样支持,例如icontains,endswith,iendswith,iexact,regex,iregex, startswith,istartswith,lt,lte,gt,gte,使用起来也是非常方便

>>> Hero.objects.filter(data__age__lte=12)
<QuerySet [<Hero: ops-coffee.cn>]>
>>>
>>> Hero.objects.filter(data__group__name__startswith='ow')
<QuerySet [<Hero: ops-coffee.cn>]>

SQLite3报错处理

我在Windows下开发测试时,当migrate生成表的时候遇到了如下报错,这主要是因为SQLite不支持JSONFields导致的

SQLite does not support JSONFields

解决方法为:

先去sqlite官网下载对应的DLL软件包https://www.sqlite.org/download.html,然后替换掉当前使用的sqlite3.dll文件。例如我的windows为64位版本,所以下载了sqlite-dll-win64-x64-3320300.zip这个软件包,本地python的安装路径为C:\python36,直接将C:\python36\DLLs\sqlite3.dll用下载的软件包里的sqlite3.dll文件替换,然后再次运行migrate顺利创建了数据库表

Django ORM中原生JSONField的使用方法相关推荐

  1. django ORM中的RelatedManager(关联管理器)

    关联管理器应用在 一对多的表 或者 多对多的表 多对多表中的用法: 在多对多的表中 正向查询 #基于对象的查询 #正查 # author_obj = Author.objects.get(id=1) ...

  2. Django ORM 中的批量操作

    数据模型定义 from django.db import modelsclass Product(models.Model):name = models.CharField(max_length=20 ...

  3. python怎么更新数据库_在Python的Django框架中更新数据库数据的方法

    先使用一些关键参数创建对象实例,如下: >>> p = Publisher(name='Apress', ... address='2855 Telegraph Ave.', ... ...

  4. django mysql 创建表_关于 django ORM 中,数据库建表方式的问题

    本人以前是做客户端的,做后端没多久. 一直有一个问题困扰我,正好现在手上有一个系统在做. 系统逻辑是写一个爬虫在网上爬取一个网站的信息, 经过加工处理后,使用 django 来展示和交互. 表结构简化 ...

  5. Django ORM操作

    Django ORM操作 一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果<2> get(**kwargs): 返回与所给筛选条 ...

  6. Django ORM那些相关操作

    一般操作 https://docs.djangoproject.com/en/1.11/ref/models/querysets/         官网文档 常用的操作 <1> all() ...

  7. django ORM相关的那些操作汇总

    必知必会13条 <1> all(): 查询所有结果<2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象<3> get(**kwargs): ...

  8. Django - ORM操作

    Django - ORM操作 一. 必知必会13条 单表查询之神奇的双下划线 二. ForeignKey操作 正向查找 反向操作 三. ManyToManyField 四. 聚合查询和分组查询 聚合 ...

  9. python django orm查询集总结

    1 .什么是ORM (Object Relational Mapping ) 它的作用是在关系型数据库和业务实体对象做一个映射,我们在操作具体业务对象的时候就可以省去了和SQL语句打交道,只需要简单的 ...

最新文章

  1. 【PC工具】文件压缩解压工具winrar解压缩装机必备软件,winRAR5.70免费无广告
  2. tcpdump抓包命令_tcpdump实战
  3. Asp.Net Mvc之模型注解
  4. 背水一战 Windows 10 (70) - 控件(控件基类): UIElement - Transform3D(3D变换), Projection(3D投影)...
  5. linux脚本语句,LINUX shell 脚本语句
  6. 阻止函数源码在控制台输出
  7. 计算机组成原理 微指令编码_计算机组成原理(指令)
  8. HDU 2609 最小表示法
  9. 汇编跳转指令(转载)
  10. Java从入门到精通(一)
  11. MySQL 数据库简介
  12. 安装cude11.2.exe报错:Could not create file “C: )Users\xxx\ AppData \Local\ Temp \CUDA\GFExperience
  13. RobotFramework之Dialogs
  14. Jetpack 架构组件:LiveData
  15. 浅谈RESTful风格
  16. 李潤慶 崇德齋 頗有逗撓
  17. 如何一招永久删除hao123流氓网页挟持
  18. matlab 错误使用 connector.internal.autostart.run输入参数的数目不足。
  19. 英语书写_手写印刷体
  20. 计算机编程语言发展史

热门文章

  1. 微信支付,redirect_uri域名与后台配置不一致,错误代码10003
  2. Contiki 2.7 Makefile 文件(五)
  3. 导入开源的文件云存储平台-Seafile
  4. protobuf 向前兼容向后兼容
  5. R载入需要的程辑包:rJava Error
  6. Java笔记9:构造方法,内部类
  7. 盗版Windows系统IE 7.0的安装
  8. idea常用快捷方式
  9. powerDesigner生成excel版本的数据库文件
  10. Java 开发常用类库和API