Django ORM中原生JSONField的使用方法

article/2025/9/23 17:54:47

带你尝鲜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顺利创建了数据库表


http://chatgpt.dhexx.cn/article/TLnMXoDa.shtml

相关文章

net.sf.json.JSONObject对象使用指南

1 简介 在程序开发过程中&#xff0c;在参数传递&#xff0c;函数返回值等方面&#xff0c;越来越多的使用JSON。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式&#xff0c;同时也易于机器解析和生成、易于理解、阅读和撰写&#xff0c;而且Json采用完全独立于语…

@JsonFormat、@JSONField、@DateTimeFormat详细解说

三者出处 1、JsonFormat来源于jackson&#xff0c;Jackson是一个简单基于Java应用库&#xff0c;Jackson可以轻松的将Java对象转换成json对象和xml文档&#xff0c;同样也可以将json、xml转换成Java对象。Jackson所依赖的jar包较少&#xff0c;简单易用并且性能也要相对高些&a…

Django JSONField类型操作解析

Django JSONField类型操作解析 模型代码设计正向查询与反向查询解析Json字段操作解析新增查询Json条件查询字段条件查询跨关系查询 修改删除 接口测试平台核心以Httprunner为接口用例运行框架&#xff0c;要将用例的数据持久化到数据库中&#xff0c;方便读取修改与存储&#x…

【java】属性别名:@JsonProperty和@JSONField的区别?【图文教程】

平凡也就两个字: 懒和惰; 成功也就两个字: 苦和勤; 优秀也就两个字: 你和我。 跟着我从0学习JAVA、spring全家桶和linux运维等知识&#xff0c;带你从懵懂少年走向人生巅峰&#xff0c;迎娶白富美&#xff01; 关注微信公众号【 IT特靠谱 】&#xff0c;每一篇文章都是心得总结…

fastjson @JSONField format 不生效的原因

&#xff08;以下问题已在fastjson高版本优化<目前我用的是1.2.83版本>&#xff09; 在一次接手项目中发现&#xff0c;http接口返回json数据&#xff0c;Date类型的变量用JSONField format注解格式化不起作用。排查原因&#xff1a; 1&#xff09;查http接口序列化是不…

formdata和json

HTTP content-type Content-Type&#xff08;内容类型&#xff09;&#xff0c;一般是指网页中存在的 Content-Type&#xff0c;用于定义网络文件的类型和网页的编码&#xff0c;决定浏览器将以什么形式、什么编码读取这个文件&#xff0c;这就是经常看到一些 PHP 网页点击的结…

常用注解@JsonField、@JsonFormat、@DateTimeFormat区别

JsonFormat 该注解来源于jackson包中的注解&#xff0c;主要用来控制后端返回给前端的日期格式&#xff0c;通常用在返回给前端的实体类中。 案例如下&#xff1a; class User{private Integer id;JsonFormat(pattern”yyyy-MM-dd”,timezone”GMT8”)private Date birthday;…

Springboot中使用@JsonProperty和@JSONField

2个注解都是为了解决json字符串的某些属性名和JavaBean中的属性名匹配不上的问题。 例子&#xff0c;不使用注解的情况 Data public class Routine {private Integer TTS_voice;} PostMapping("/test8")public Routine test8(RequestBody Routine routine){retur…

@JSONField

1.引入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.76</version></dependency> 2.JSONField注解可以用在方法&#xff08;method&#xff09;&#xff0c;属性&#xff0…

@JsonField 不起作用

在Springboot中默认的JSON解析框架是jackson&#xff0c;引入alibaba的fastjson&#xff0c;使用JSONField 去接收带有native的json请求&#xff0c;实体类名需要做一个转换&#xff0c;但是接受json串的时候&#xff0c;用到JsonField不起作用&#xff0c;接受过来还是null。 …

一眼看清@JSONField注解使用与效果

JSONField是做什么用的 JSONField是fastjson的一个注解&#xff0c;在fastjson解析一个类为Json对象时&#xff0c;作用到类的每一个属性&#xff08;field&#xff09;上。 通过用JSONField注解一个类的属性&#xff0c;我们可以达到以下目标 指定field对应的key名称&#…

perclos

WierwiIIe驾驶模拟器上的实验结果证明&#xff0c;眼睛的闭合时间一定程度地反映疲劳&#xff0c; 如图 所示。 在此基础上&#xff0c; 卡内基梅隆研究所经过反复实验和论证&#xff0c;提出了度量疲劳/瞌睡的物理量 PERCLOS &#xff08;Percentage of EyeIid CIosure over t…

机器视觉毕业设计 深度学习驾驶人脸疲劳检测系统 - python opencv

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.2 打哈欠检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的…

Android studio开发 课设必备疲劳检测app

使用android内置摄像头&#xff0c;可以根据人的状态判定是否疲劳&#xff0c;界面设计较好&#xff0c;检测后还可以回到主界面 运行截图如下&#xff0c;获取源码有偿&#xff0c;拒绝白嫖党~

基于MATLAB的人眼开度疲劳检测识别

一、课题背景 目前&#xff0c;随着人们生活水平的提高&#xff0c;各国人民汽车保有量也越来越多&#xff0c;伴随而来的是交通事故也在不断增多。研究表明&#xff0c;疲劳驾驶是造成交通事故日益严重的重要原因。开展驾驶员疲劳检测和预警的研究工作&#xff0c;有着十分重…

Dlib+Opencv库实现疲劳检测

文章目录 1.关键点检测2.算法实现的核心点3.算法实现&#xff08;1&#xff09;人脸的关键点集合&#xff08;2&#xff09;加载人脸检测库和人脸关键点检测库&#xff08;3&#xff09;绘制人脸检测的框&#xff08;4&#xff09;对检测之后的人脸关键点坐标进行转换&#xff…

Python基于OpenCV的工作疲劳检测系统[源码&UI界面&部署教程]

1.图片演示 2.视频演示 [项目分享]Python基于OpenCV的实时疲劳检测[源码&#xff06;演示视频&#xff06;部署教程]_哔哩哔哩_bilibili 3.检测方法 1&#xff09;方法 与用于计算眨眼的传统图像处理方法不同&#xff0c;该方法通常涉及以下几种组合&#xff1a; 1、眼睛定…

Opencv之疲劳检测

项目要求 在一段视频中&#xff0c;通过检测人眨眼的次数来判断他的疲劳程度。 代码实现 1、导入工具包 from scipy.spatial import distance as dist import numpy as np import dlib import cv22、对脸上的部位进行定义 在关键点定位的官方文档中&#xff0c;提取68个关…

人脸识别-驾驶疲劳检测(1) 眨眼检测

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、背景 &#xff08;1&#xff09;环境搭建 &#xff08;2&#xff09;下载开源数据集 &#xff08;3&#xff09;视觉疲劳检测原理 二、代码示例 三、效…

人脸检测高级:疲劳检测

今天我们实现疲劳检测。 如果眼睛已经闭上了一段时间&#xff0c;我们会认为他们开始打瞌睡并发出警报来唤醒他们并引起他们的注意。我们测试一段视频来展示效果。同时代码中保留开启摄像头的的代码&#xff0c;取消注释即可使用。 使用 OpenCV 构建犯困检测器 要开始我们的实…