在Django中使用UTF-8编码的JSON fixture文件

tep*_*pez 5 django unicode json utf-8 fixtures

我正在尝试编写一个JSON初始数据夹具,它将在每次调用后加载syncdb.

initial_data.json在我的mysite/myapp/fixtures目录中放置了一个文件:

[
  {
    "model": "myapp.Person",
    "pk": 1,
    "fields": {
      "first_name": "Tom",
      "last_name": "Yam"
    }
  }
]
Run Code Online (Sandbox Code Playgroud)

当文件以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
Run Code Online (Sandbox Code Playgroud)

根据Django 文档,我需要设置ensure_ascii=False何时使用非ASCII数据和JSON序列化程序,但我无法想象如何做(因为它是从syncdb函数调用的.

有任何想法如何使用UTF-8编码的JASON文件作为夹具?

bmi*_*lac 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)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 编写自己的管理命令即可通过ensure_ascii

希望这可以帮助。