Django dumpdata utf-8 (unicode)
Pergunta
Existe uma maneira fácil de despejar UTF-8 dados de um banco de dados?
Eu conheço este comando:
manage.py dumpdata > mydata.json
Mas os dados que obtive no arquivo mydata.json, os dados Unicode se parecem:
"name": "\u4e1c\u6cf0\u9999\u6e2f\u4e94\u91d1\u6709\u9650\u516c\u53f8"
Eu gostaria de ver uma string unicode real como 全球卫星定位系统
(Chinês).
Solução
django-admin.py dumpdata seupp poderia despejar para esse fim.
Ou se você usar o MySQL, poderá usar o mysqldump comando para despejar todo o banco de dados.
E este tópico tem muitas maneiras de despejar dados, incluindo métodos manuais.
ATUALIZAR: Porque o OP editou a pergunta.
Para converter da String de codificação JSON em string legível por humanos, você pode usar isso:
open("mydata-new.json","wb").write(open("mydata.json").read().decode("unicode_escape").encode("utf8"))
Outras dicas
Depois de lutar com problemas semelhantes, acabei de descobrir que o XML Formatter lida com o UTF8 corretamente.
manage.py dumpdata --format=xml > output.xml
Eu tive que transferir dados do Django 0,96 para o Django 1.3. Após inúmeras tentativas com dados de despejo/carga, finalmente consegui usar o XML. Sem efeitos colaterais por enquanto.
Espero que isso ajude alguém, como eu aterrissei neste tópico ao procurar uma solução.
Você precisa encontrar a chamada para json.dump*()
no código do django e passe a opção adicional ensure_ascii=False
e depois codifique o resultado depois, ou você precisa usar json.load*()
para carregar o JSON e depois despejá -lo com essa opção.
Aqui eu escrevi um trecho para isso. Funciona para mim!
import codecs
src = "/categories.json"
dst = "/categories-new.json"
source = codecs.open(src, 'r').read().decode('string-escape')
codecs.open(dst, "wb").write(source)
Você pode criar seu próprio serializador que passa ensure_ascii=False
argumento para json.dumps
função:
# serfializers/json_no_uescape.py
from django.core.serializers.json import *
class Serializer(Serializer):
def _init_options(self):
super(Serializer, self)._init_options()
self.json_kwargs['ensure_ascii'] = False
Em seguida, registre um novo serializador (por exemplo em seu aplicativo __init__.py
Arquivo):
from django.core.serializers import register_serializer
register_serializer('json-no-uescape', 'serializers.json_no_uescape')
Então você pode correr:
manage.py dumpdata --format=json-no-uescape > output.json
Apenas deixe aqui:
./manage.py dumpdata --indent=2 core.item | python3 -c "import sys; sys.stdout.write(sys.stdin.read().encode().decode('unicode_escape'))" > core/fixtures/item.json