Django dumpdata UTF-8 (Юникод)

Есть ли простой способ сбросить данные UTF-8 из базы данных?

Я знаю эту команду:

manage.py dumpdata > mydata.json

Но данные, которые я получил в файле mydata.json, данные Unicode выглядят так:

"name": "\u4e1c\u6cf0\u9999\u6e2f\u4e94\u91d1\u6709\u9650\u516c\u53f8"

Я хотел бы видеть настоящую строку Unicode, например 全球卫星定位系统 (китайский).


person icn    schedule 26.01.2010    source источник


Ответы (10)


django-admin.py dumpdata yourapp может сбрасывать для этой цели.

Или, если вы используете MySQL, вы можете использовать команду mysqldump сбросить всю базу данных.

И в этом потоке есть много способов сбросить данные, включая ручные.

ОБНОВЛЕНИЕ: поскольку OP редактировал вопрос.

Чтобы преобразовать строку кодировки JSON в удобочитаемую строку, вы можете использовать это:

open("mydata-new.json","wb").write(open("mydata.json").read().decode("unicode_escape").encode("utf8"))
person YOU    schedule 26.01.2010
comment
спасибо, я знаю эту команду, но данные, которые я получил в файле mydata.json, данные Unicode выглядят как name: \ u4e1c \ u6cf0 \ u9999 \ u6e2f \ u4e94 \ u91d1 \ u6709 \ u9650 \ u516c \ u53f8 Я хотел бы увидеть настоящая строка Юникода, например '全球 卫星 定位 系统' (китайский) - person icn; 26.01.2010
comment
Добавлены коды для преобразования этого. Я не уверен, что встроенная функция dumpdata может это сделать или нет. - person YOU; 26.01.2010
comment
AttributeError: объект 'str' не имеет атрибута 'decode' - person Kiran Reddy; 07.10.2019

После борьбы с подобными проблемами я только что обнаружил, что форматтер xml правильно обрабатывает UTF8.

manage.py dumpdata --format=xml > output.xml

Мне пришлось перенести данные из Django 0.96 в Django 1.3. После многочисленных попыток с данными дампа / загрузки мне наконец удалось использовать xml. Побочных эффектов пока нет.

Надеюсь, это кому-то поможет, так как я попал в эту ветку, когда искал решение ..

person Tisho    schedule 29.10.2011
comment
Та же ошибка с xml django.db.utils.OperationalError: Problem installing fixture '/app/tours/fixtures/tours.xml': Could not load tours.Tour(pk=06541d20-a873-11e9-b91d-5b320e2b2922): (1366, "Incorrect string value: '\\xCC\\x88kull...' for column 'description' at row 1") - person Kiran Reddy; 07.10.2019

Вам нужно либо найти вызов json.dump*() в коде Django и передать дополнительную опцию ensure_ascii=False, а затем закодировать результат, либо вам нужно использовать json.load*() для загрузки JSON, а затем выгрузить его с этой опцией.

person Ignacio Vazquez-Abrams    schedule 26.01.2010
comment
я не понимаю, почему эта опция недоступна - person doniyor; 07.11.2014

Здесь я написал для этого фрагмент кода. Работает на меня!

person dir01    schedule 12.11.2010

Вы можете создать свой собственный сериализатор, который передает ensure_ascii=False аргумент функции json.dumps:

# 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

Затем зарегистрируйте новый сериализатор (например, в вашем __init__.py файле приложения):

from django.core.serializers import register_serializer

register_serializer('json-no-uescape', 'serializers.json_no_uescape')

Тогда вы можете запустить:

manage.py dumpdata --format=json-no-uescape > output.json

person Victor Akimov    schedule 19.04.2019

Поскольку ВЫ предоставили хороший принятый ответ следует учитывать, что python 3 различает текстовые и двоичные данные, поэтому оба файла необходимо открывать в двоичном режиме:

open("mydata-new.json","wb").write(open("mydata.json", "rb").read().decode("unicode_escape").encode("utf8"))

В противном случае возникнет ошибка AttributeError: 'str' object has no attribute 'decode'.

person Ali Shamakhi    schedule 16.01.2020

Обычно я добавляю в свой Makefile следующие строки:

.PONY: dump

# make APP=core MODEL=Schema dump
dump:
    @python manage.py dumpdata --indent=2 --natural-foreign --natural-primary ${APP}.${MODEL} | \
    python -c "import sys; sys.stdout.write(sys.stdin.read().encode().decode('unicode_escape'))" \
    > ${APP}/fixtures/${MODEL}.json

Это нормально для стандартной структуры проекта django, исправьте, если структура вашего проекта отличается.

person Denis Eliseev    schedule 29.08.2019

Эта проблема была исправлена ​​как для JSON, так и для YAML в Django 3.1.

person highpost    schedule 07.07.2020

Я столкнулся с той же проблемой. Прочитав все ответы, я придумал сочетание Али и darthwade:

manage.py dumpdata app.category --indent=2 > categories.json
manage.py shell

import codecs
src = "/categories.json"
dst = "/categories-new.json"
source = codecs.open(src, "rb").read().decode('unicode-escape')
codecs.open(dst, "wb","utf-8").write(source)

В Python 3 мне пришлось открыть файл в двоичном режиме и декодировать как unicode-escape. Также я добавил utf-8 при открытии в режиме записи (двоичный).

Я надеюсь, что это помогает :)

person Cédryc Ruth    schedule 19.04.2020

Вот решение от djangoproject.com. Вы переходите в «Настройки», там есть пункт «Использовать Unicode UTF-8 для всемирной языковой поддержки», поле «Язык» - «Настройки административного языка» - «Изменить языковой стандарт системы» - «Настройки региона». Если мы применим это и перезагрузимся, то мы получим разумную, современную кодировку по умолчанию от Python. djangoproject.com

person Wertartem    schedule 26.02.2021