如何使用Django ORM提取MySQL表中JSON字段的键?
解决方法:用Django ORM封装MySQL JSON函数实现键提取
要实现类似Python字典keys()的效果——提取每个JSON字段的键(你的场景里每个JSON对象只有单个键或为空),我们可以借助MySQL原生的JSON处理函数,通过Django ORM的Func类来调用它们,具体步骤如下:
1. 确认模型定义
首先确保你的模型里的JSON字段正确配置:
from django.db import models from django.db.models.fields import JSONField class MyJsonModel(models.Model): myjson = JSONField() class Meta: db_table = 'your_table_name' # 替换成你实际的表名
2. 编写ORM查询语句
我们需要组合使用MySQL的JSON_KEYS、JSON_EXTRACT、JSON_UNQUOTE函数,再用Coalesce处理空JSON的情况:
from django.db.models import Func, F, Value from django.db.models.functions import Coalesce from django.db.models.fields import TextField from myapp.models import MyJsonModel # 替换成你的模型所在路径 # 构建查询逻辑 queryset = MyJsonModel.objects.annotate( # 第一步:获取JSON对象的键组成的数组 json_key_array=Func(F('myjson'), function='JSON_KEYS'), # 第二步:提取数组第一个元素并去除JSON字符串的引号 raw_key=Func( Func(F('json_key_array'), Value('$[0]'), function='JSON_EXTRACT'), function='JSON_UNQUOTE', output_field=TextField() ), # 第三步:把空JSON返回的NULL替换成空字符串,匹配预期输出 myjson_keys=Coalesce(F('raw_key'), Value(''), output_field=TextField()) ).values_list('myjson_keys', flat=True) # 查看结果 for key in queryset: print(key)
3. 各部分逻辑解释
JSON_KEYS(myjson):返回当前行JSON对象的所有键组成的数组,比如{"key1":22}会得到["key1"],空对象{}得到[]JSON_EXTRACT(json_key_array, '$[0]'):取出数组的第一个元素,空数组会返回NULLJSON_UNQUOTE(...):去掉JSON字符串的引号,把"key1"转换成纯文本key1Coalesce(raw_key, ''):将空JSON产生的NULL替换成空字符串,对应你期望的空行输出
对应的原生SQL参考
如果想验证逻辑,这个ORM查询对应的MySQL原生SQL大致是:
SELECT COALESCE( JSON_UNQUOTE(JSON_EXTRACT(JSON_KEYS(myjson), '$[0]')), '' ) AS myjson_keys FROM your_table_name;
内容的提问来源于stack exchange,提问作者JPG
相关产品推荐
相关产品推荐

