如何在Django中使用JSONField存储波斯语字符并解决Unicode转义问题
问题原因
- PostgreSQL存储JSON/JSONB类型数据时,默认会对非ASCII字符做Unicode转义处理,你看到的
\u0628\u0631\u0646\u062f格式是转义后的正常存储形式,并非数据损坏,Django读取该字段时会自动将其转回原始波斯语字符,默认不影响业务读写。 - 若Django读取字段后仍无法正常展示波斯语,则是数据库连接编码配置错误导致。
解决方案
- 若仅在直接查询数据库时看到转义序列,业务侧读写正常:无需做任何修改,该存储形式是PostgreSQL JSON类型的标准行为,数据完整性不受影响。
- 若需要数据库内直接存储可读的波斯语字符,可自定义JSON编码器关闭ASCII转义:
- 定义自定义编码器
import json from django.core.serializers.json import DjangoJSONEncoder from django.contrib.postgres.fields import JSONField class NonEscapeJSONEncoder(DjangoJSONEncoder): def encode(self, o): return json.dumps(o, ensure_ascii=False, cls=DjangoJSONEncoder)
- 修改模型字段指定编码器
class example(models.Model): spec_json = JSONField( null=True, blank=True, encoder=NonEscapeJSONEncoder )
- 若读取时仍存在乱码,检查数据库连接配置,在
settings.py中添加UTF8编码指定:
DATABASES = { "default": { # 原有数据库配置保持不变 "OPTIONS": { "client_encoding": "UTF8" } } }
内容的提问来源于stack exchange,提问作者ali ardakani
相关产品推荐
相关产品推荐

