引用原文: Django ORM中原生JSONField的使用方法

Django最新版v3.1的主要更新之一便是完善了对JSON数据存储的支持,新增models.JSONField和forms.JSONField,可在所有受支持的数据库后端上使用,可在所有受支持的数据库后端上使用。
目前支持的数据库以及对应版本主要有
MariaDB 10.2.7+
,MySQL 5.7.8+
,Oracle
,PostgreSQL
和SQLite 3.9.0+
但个别Django的查询方法可能与部分数据库不兼容,例如contains和contained_by就不支持Oracle和SQLite数据库

JsonField使用

from django.db import models
class 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查询

在字段和字段内的值间使用双下划线进行层级连接表示

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

查询 当想要查询age为12的数据时可以这样查询

# 注意data字段中age条件的查询方法为 "data__age",用的是双下划线,
Hero.objects.filter(data__age=12)<QuerySet [<Hero: ops-coffee.cn>]>

当想要查询group的name为ow1的数据时可以这样查询

# 在字段层级之间使用双下划线进行连接表示
Hero.objects.filter(data__group__name='ow1')<QuerySet [<Hero: ops-coffee.cn>]>

DjangoORM JsonField查询相关推荐

  1. Django ORM中原生JSONField的使用方法

    带你尝鲜Django最新版重要更新JSONField的使用 Django最新版v3.1的主要更新之一便是完善了对JSON数据存储的支持,新增models.JSONField和forms.JSONFie ...

  2. 知识点old1908

    队列中... linux-安装mysql-rpm方式 - pyhui的python全栈技术博客 - CSDN博客 https://blog.csdn.net/ifubing/article/detai ...

  3. 数据结构与算法(C语言)

    第一章: 数据结构绪论 1.什么是程序:程序 = 数据结构 + 算法 2.逻辑结构&物理结构的区别用法 基本的目标就是将数据及其逻辑关系存储到计算机的内存中 一:逻辑结构: 逻辑结构是指数据对 ...

  4. django-orm查询-验证是否存在的方式

    查询一个数据的多个方法 >get方式查询 如果查询不到结果, DoesNotExist: 或者 查询的结果超过一个, MultipleObjectsReturned: 都会报错 >filt ...

  5. django-orm查询功能词

    小结 利用条件查询的使用格式 ? 模型类.objects.filter(字段__查询功能=值)等于 ? exact包含 ? contains以某某开头 ? startswith以某某结尾 ? ends ...

  6. 来自于DjangoORM查询的蜜汁bug

    RelatedObjectDoesNotExist:XXX has no xxx 今天遇到了一个蜜汁bug如下:ChainToNode是我的一个多对多关系的中间表 有着两个外键字段,其中一个叫node ...

  7. django查询集-17

    当查询结果是多个的时候,django-ORM会返回一个 查询集(QuerySet) ,表示从数据库中获取对象的 集合 . 查询集可以使用过滤器进行再次处理. 例如查询阅读量大于20且评论数大于30的书 ...

  8. DjangoORM框架

    DjangoORM框架 文章目录 DjangoORM框架 一.ORM框架 1.ORM简介 2.使用django进行数据库开发的步骤如下: 3.定义模型类 4.迁移 5.数据操作 5.对象的关联操作 6 ...

  9. 日期类型前后台传递格式控制注解@DateTimeFormat@JsonFormat@JSONField

    开发中经常遇到的日期字符串转换为Date的情况,在此记录一下. 后台接收前台传递的日期数据,在对应的参数Bean的Date属性字段上使用@DateTimeFormat(pattern="yy ...

最新文章

  1. CICC科普栏目丨时间之箭:从熵到大爆炸再到万物理论(一)
  2. 数据运算,条件测试,if选择结构
  3. node.js mysql 不退出,mysql - 错误:使用NodeJS在MySQL中调用退出后无法排队查询 - SO中文参考 - www.soinside.com...
  4. 面试题:如何编写一个杯子测试用例
  5. css_oneday
  6. php node 目录,node.js基于fs模块对系统文件及目录进行读写操作的方法详解
  7. QT QTransform与QMatrix 有啥区别?
  8. python引入模块教程_python导入模块--案例
  9. zynq开发系列6:创建AXI IP实现PS对PL的数据配置(步骤三配置SDK)
  10. CRLF对GIT DIFF的影响
  11. 如何解决笔记本键盘突然失灵的问题
  12. 百度地图线路查询路线样式自定义
  13. win7台式计算机型号怎么查,教您电脑主板型号怎么看
  14. 我国期货市场发展潜力和方向
  15. 起步 —— 种一棵树最好的时间是十年前
  16. 2022年海外有哪些直播带货平台?直播带货要怎么做?
  17. nginx报错:src/core/ngx_murmurhash.c:39:11: error: this statement may fall through [-Werror=implicit-fa
  18. OA 系统与 ERP 的关系,两者是如何对接集成的?
  19. 基于canoe 新建一个lin工程_基于CANoe的车身控制器CAN/LIN网络设计方法
  20. SQL Server 2008 R2 下载 iso

热门文章

  1. Flutter中编解码Convert基本使用
  2. 界面让table居中的办法
  3. 签到APP:android入门级小项目,Node.js 提供服务端接口。
  4. Python 爬取 42 年高考数据,告诉你高考为什么这么
  5. ENJ2005-C功率器件图示系统
  6. 1-1-01-电商数据建模
  7. latext插入双栏图片定位问题
  8. java题兔子第三个月生_【Java】题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每...
  9. SQL中add添加列语句
  10. 黑帽SEO之暗链方法大全,那种最好,不易被蜘蛛搜索引擎察觉