我正在使用loaddata重新加载灯具(由于某种原因,数据库中的数据似乎已损坏)。这样做会导致错误,指示loaddata
将xml视为ascii。实际上是UTF-8,这会导致错误:
$ python manage.py loaddata --traceback ./countries/fixtures/initial_data.xml
Traceback (most recent call last):
File "/home/marcintustin/oneclickrep/oneclickcosvirt/lib/python2.7/site-packages/django/core/management/commands/loaddata.py", line 202, in handle
'error_msg': e
UnicodeDecodeError: 'ascii' codec can't decode byte 0xf1 in position 6: ordinal not in range(128)
(增加详细程度只是告诉我它在哪里寻找固定装置。没有更多信息了。这是
loaddata
提供的完整堆栈跟踪)。灯具开始:
<?xml version="1.0" encoding="utf-8"?>
<django-objects version="1.0">
<object pk="AF" model="countries.country">
<field type="CharField" name="name">AFGHANISTAN</field>
<field type="CharField" name="printable_name">Afghanistan</field>
<field type="CharField" name="iso3">AFG</field>
<field type="PositiveSmallIntegerField" name="numcode">4</field>
</object>
<!-- rest of file -->
</django-objects>
它声明自己为utf-8,而它却是utf-8(为确定起见,我使用emacs将其重新保存为utf-8)。
这里的问题不是我的输入是utf-8,而是
loaddata
想要将其视为其他内容。如何强制loaddata
正确解码?或者,在将xml手动加载到unicode字符串后,以编程方式调用loaddata
的东西有多容易?在Linux上使用django 1.4,将sqlite作为数据库后端。
最佳答案
虽然可以通过loaddata
中的call_command
以编程方式调用django.core.management
,但是似乎没有设置编码或字符串输入的选项。因此,当您调用它时,仍然会传递相同的文件,并且也会遇到相同的问题。
一种选择是创建自己的具有用于编码的参数的loaddata。您可以复制默认的loaddata
command并添加几行来进行编码。似乎要开始的相关行是here。