You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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]'):取出数组的第一个元素,空数组会返回NULL
  • JSON_UNQUOTE(...):去掉JSON字符串的引号,把"key1"转换成纯文本key1
  • Coalesce(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:51:38