Использование файла фиксации JSON в кодировке UTF-8 в Django

Я пытаюсь написать фикстуру исходных данных JSON, которая будет загружаться после каждого вызова syncdb.

Я поместил файл initial_data.json в свой каталог mysite/myapp/fixtures:

[
  {
    "model": "myapp.Person",
    "pk": 1,
    "fields": {
      "first_name": "Tom",
      "last_name": "Yam"
    }
  }
]

Все работает, когда файл закодирован в ASCII, но когда я сохраняю его в кодировке UTF-8 (мне нужно использовать символы, отличные от ASCII), я получаю следующую ошибку:

Problem installing fixture 'initial_data.json': Traceback (most recent call last):
File "D:\Tom\DjangoEnv\Lib\site-packages\django\core\management\commands\loaddata.py", line 190, in handle
for obj in objects:
File "D:\Tom\DjangoEnv\Lib\site-packages\django\core\serializers\json.py", line 47, in Deserializer
raise DeserializationError(e)
DeserializationError: No JSON object could be decoded

Согласно документации Django, мне нужно установить ensure_ascii=False при работе с не-ASCII-данные и сериализаторы JSON, но я не могу понять, как это сделать (поскольку он вызывается из функции syncdb.

Любые идеи, как использовать файл JASON в кодировке UTF-8 в качестве приспособления?


person tepez    schedule 28.09.2012    source источник
comment
Что вы имеете против побегов Unicode?   -  person Ignacio Vazquez-Abrams    schedule 28.09.2012


Ответы (1)


load_data не будет передавать параметр ensure_ascii сериализатору, поэтому у вас есть два варианта:

  1. преобразовать данные в ascii unicode, экранированные перед загрузкой, то есть:

    import codecs
    encoded = codecs.open('/tmp/tst.txt', 'r', 'utf-8').read().encode(
                'ascii', 'backslashreplace')
    open('/tmp/tst-encoded.txt', 'w').write(encoded)
    
  2. напишите свою команду управления, которая будет передавать ensure_ascii

надеюсь это поможет.

person bmihelac    schedule 28.09.2012
comment
Спасибо!!! Преобразование сработало. Я сделал небольшое изменение: open('/tmp/tst-encoded.txt', 'w').write(encoded[6:]). Нарезка была необходима для удаления \ufeff - person tepez; 28.09.2012