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
相关产品推荐
相关产品推荐

