我对今天遇到的问题感到非常困惑:我有一个PostgreSQL数据库,其表格不是由Django管理的,而是通过QuerySet对这些表进行完全正常的查询。但是,我开始获得Unicode异常,当我开始挖掘时,我发现我的QuerySets正在返回非Unicode字符串!
示例代码:
d = Document.objects.get(id=45787)
print repr(d.title), type(d.title)
上述语句的输出是普通字符串(没有u
前缀),后跟<str>
类型标识符。此外,此普通字符串包含原始字节格式的UTF-8数据!如果我调用d.title.decode('utf-8')
,我会得到有效的Unicode字符串!
更令人费解的是,某些字段正常工作。同一个表/模型包含另一个相同类型的html_filename
TextField
,其中正确返回,作为Unicode字符串!
我有 no 特殊选项,数据库数据已正确编码,我甚至不知道从哪里开始搜索解决方案。这是Django 1.6.2。
更新
数据库服务器编码像往常一样是UTF8,并且数据已正确编码。这是在Ubuntu上的PostgreSQL 9.1上。
更新2:
我想我可能找到了原因,但我不知道它为什么会这样:我认为数据库字段像往常一样用text
类型定义,但是它们被定义了为citext
(http://www.postgresql.org/docs/9.1/static/citext.html)。由于Django模型是不受管理的,因此看起来Django并不能将字段类型解释为值得转换为Unicode。任何想法如何强制Django这样做?
答案 0 :(得分:0)
显然,Django不会将citext
类型的字段视为文本字段,并将它们作为Unicode字符串返回。