引用原文: 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>]>