DjangoORM JsonField查询

引用原文: 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>]>
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值