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

Django模型使用JSONField生成jsonb类型,如何改为存储原生json保留键顺序?

实现步骤

1. 适配Django 4.2及以上版本(最简方案)

Django 4.2开始,PostgreSQL专属的JSONField已经内置了use_jsonb参数,直接将参数设置为False即可指定使用原生json类型而非默认的jsonb:

from django.contrib.postgres.fields import JSONField

class Component(models.Model):
    name = models.CharField(max_length=200, unique=True)
    attributes = JSONField(
        use_jsonb=False,
        default=dict, 
        help_text='Component attributes in JSONSchema'
    )

2. 适配Django 4.2以下版本(通用方案)

低版本Django没有内置参数切换,可通过自定义字段的方式指定数据库存储类型为json:
首先定义自定义字段:

from django.db import models
import json

class NativeJSONField(models.Field):
    description = "PostgreSQL原生JSON类型,保留键的原始顺序"

    def db_type(self, connection):
        # 指定数据库层面使用json类型
        return 'json'

    def to_python(self, value):
        # 从数据库读取时自动反序列化为Python对象
        if value is None or isinstance(value, (dict, list)):
            return value
        try:
            return json.loads(value)
        except (TypeError, ValueError):
            return value

    def get_prep_value(self, value):
        # 写入数据库前序列化为JSON字符串
        if value is None:
            return value
        return json.dumps(value)

然后替换模型中原有的JSONField即可:

class Component(models.Model):
    name = models.CharField(max_length=200, unique=True)
    attributes = NativeJSONField(
        default=dict, 
        help_text='Component attributes in JSONSchema'
    )

后续操作

修改完模型字段后,执行以下命令生成并执行迁移即可生效:

python manage.py makemigrations
python manage.py migrate

注意:原生json类型仅做原始字符串存储,不支持jsonb的字段内键查询、索引等能力,如果后续有对该字段内部值做检索筛选的需求,建议权衡后再选择类型。

内容的提问来源于stack exchange,提问作者A l w a y s S u n n y

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:54:04