我有一个关键字列表
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
。
我试过了:
u
decode('utf-8')
- 如果关键字前面附加u
,则成功创建并保存对象encode('utf-8')
功能中删除__unicode__(self)
。 - 这样做会成功打印关键字因此,唯一有效的配置如下:
u
添加到关键字decode('utf-8')
或encode('utf-8')
但我不确定这是否是正确的做法。理想情况下,我应该读取一个关键字并将其解码为utf-8
,然后将其保存到数据库。有什么建议吗?
答案 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