解码/编码错误django python

时间:2015-07-14 16:46:57

标签: python django encoding utf-8

我有一个关键字列表
keywords = [u'encendió', u'polémica']

我正在尝试将它们加载到django模型中:

class myKeywords(model.Model):
    keyword = models.charField()

    def __unicode__(self):
        return self.keyword.encode('utf-8')

这就是我想要的:

for k in keywords:
    keyObj, created = myKeywords.objects.get_or_create(keyword=k.decode('utf-8'))
    print created, keyObj

但是,我一直得到django.utils.encoding.DjangoUnicodeDecodeError: 'ascii' codec can't decode byte

我试过了:

  1. 在关键字
  2. 的前方添加/删除u
  3. 在创建关键字对象时删除decode('utf-8') - 如果关键字前面附加u,则成功创建并保存对象
  4. encode('utf-8')功能中删除__unicode__(self)。 - 这样做会成功打印关键字
  5. 因此,唯一有效的配置如下:

    1. u添加到关键字
    2. 的前面
    3. 其他任何地方都不能decode('utf-8')encode('utf-8')
    4. 但我不确定这是否是正确的做法。理想情况下,我应该读取一个关键字并将其解码为utf-8,然后将其保存到数据库。有什么建议吗?

2 个答案:

答案 0 :(得分:3)

__unicode__方法应返回unicode字符串,而不是字节字符串。因此,您应该从encode()方法中删除__unicode__

如果您的关键字具有u''前缀,那么它们也是unicode字符串,也不必解码。

答案 1 :(得分:1)

由于Django将数据库中的所有字符串作为encode()返回,因此utf-8方法中的__unicode__()字符串不需要unicode

来自docs,

  

因为所有字符串都是作为Unicode字符串从数据库返回的,   基于字符的模型字段(CharField,TextField,URLField,   当Django从中检索数据时,将包含Unicode值   数据库。总是如此,即使数据可以适合   ASCII字节串。

由于您的关键字已经是unicode个字符串(以'u'为前缀),因此您无需在打印时执行decode()。同时删除decode()

您的代码应如下所示:

models.py

class myKeywords(model.Model):
    keyword = models.charField()

    def __unicode__(self):
        return u'%s'%(self.keyword)


keywords = [u'encendió', u'polémica']
for k in keywords:
    keyObj, created = myKeywords.objects.get_or_create(keyword=k)
    print created, keyObj