我正在使用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

10-08 08:26