Използване на UTF-8 кодиран JSON файл с фиксиране в 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.

Някакви идеи как да използвате UTF-8 кодиран JASON файл като фиксиране?


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