Django DumpData UTF-8 (Unicode)
Domanda
C'è un modo semplice per eseguire il dump UTF-8 dati da un database?
So che questo comando:
manage.py dumpdata > mydata.json
Ma i dati sono arrivato nel file mydata.json, i dati Unicode appare come:
"name": "\u4e1c\u6cf0\u9999\u6e2f\u4e94\u91d1\u6709\u9650\u516c\u53f8"
Mi piacerebbe vedere una vera e propria stringa Unicode come 全球卫星定位系统
(cinese).
Soluzione
django-admin.py DumpData yourapp potrebbe discarica a tale scopo.
Se si utilizza MySQL, è possibile utilizzare il mysqldump comando per eseguire il dump l'intero database.
questa discussione ha molti modi per scaricare i dati, tra cui metodi manuali.
Aggiorna :. Perché OP curato la domanda
Per convertire da JSON stringa di codifica a stringa leggibile che si potrebbe utilizzare questa:
open("mydata-new.json","wb").write(open("mydata.json").read().decode("unicode_escape").encode("utf8"))
Altri suggerimenti
Dopo aver lottato con problemi simili, ho appena trovato, che XML formattatore gestisce UTF-8 correttamente.
manage.py dumpdata --format=xml > output.xml
ho dovuto trasferire i dati da Django Django 0.96 a 1.3. Dopo numerosi tentativi con i dati di dump / caricamento, ho finalmente riuscito usando XML. Non ci sono effetti collaterali per la società.
Spero che questo vi aiuterà qualcuno, come ho atterrato in questa discussione quando alla ricerca di una soluzione ..
Hai bisogno di trovare sia la chiamata a json.dump*()
nel codice Django e passare il ensure_ascii=False
opzione aggiuntiva e quindi codificare il risultato dopo, o è necessario utilizzare json.load*()
per caricare il JSON e poi dump con questa opzione.
Qui ho scritto snippet per quella . Lavora per me!
import codecs
src = "/categories.json"
dst = "/categories-new.json"
source = codecs.open(src, 'r').read().decode('string-escape')
codecs.open(dst, "wb").write(source)
È possibile creare il proprio serializzatore che passa argomento ensure_ascii=False
a json.dumps
funzione:
# 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
Quindi registrare nuovo serializzatore (ad esempio nel file __init__.py
app):
from django.core.serializers import register_serializer
register_serializer('json-no-uescape', 'serializers.json_no_uescape')
Quindi è possibile eseguire:
manage.py dumpdata --format=json-no-uescape > output.json
lasciarlo qui:
./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