这是我在django中处理的另一个UnicodeDecodeError。我无法找到解决问题的方法。
我正在尝试创建一个对象:
nivel_obj = Nivel.objects.filter(id=nivel_id)
nueva_matricula = Matricula(nivel=nivel_obj, ano_lectivo=ano_lectivo, alumno=a)
nueva_matricula.save()
“Matricula”对象有一个“nivel_obj”,它是一个外键。 “nivel_obj”的名称是无法编码/解码的字符串。
我该如何解决这个问题?
这些是模型:
class Nivel(models.Model):
"""
Ej - "Octavo de Basica, 6to Curso"
"""
nombre = models.CharField(max_length=150)
class Meta:
verbose_name_plural = "niveles"
def __unicode__(self):
return u"%s" % (self.nombre)
class Matricula(models.Model):
ano_lectivo = models.PositiveIntegerField(validators=[MaxValueValidator(9999)])
alumno = models.ForeignKey(Alumno)
nivel = models.ForeignKey(Nivel, null=True) <----
status = models.CharField(max_length=150, choices=(("A", "Activo"), ("I", "Inactivo")))
def validate_unique(self, exclude=None):
if Matricula.objects.filter(alumno=self.alumno, nivel=self.nivel, ano_lectivo=self.ano_lectivo).exists():
error = u'Ya existe una matrícula igual, por favor revisa el año, el nivel y el alumno'
raise ValidationError({NON_FIELD_ERRORS: error})
else:
pass
class Meta:
verbose_name_plural = "matrículas"
verbose_name = "matrícula"
ordering = ("alumno",)
def __unicode__(self):
return u"Matricula %s %s" % (self.alumno, self.ano_lectivo)
确切的错误来自一个名为“OctavodeBásica”的“Nivel”对象,如果没有UnicodeDecodeError,我无法使用它。
这是错误:
UnicodeDecodeError at /sisacademico/matricular_grupo/
'ascii' codec can't decode byte 0xc3 in position 20: ordinal not in range(128)
...
The string that could not be encoded/decoded was: de B��sica
编辑:发现错误
好的,我发现了我的错误,我不会删除问题导致错误(UnicodeDecodeError)django给我的是完全误导。错误就是这个:
nivel_obj = Nivel.objects.filter(id=nivel_id) <---
nueva_matricula = Matricula(nivel=nivel_obj, ano_lectivo=ano_lectivo, alumno=a)
我无法使用nivel = queryset而不是nivel = NivelObject保存新对象。
它应该是:
nivel_obj = Nivel.objects.get(id=nivel_id)
我的错误。
但是,为什么在地球上django会给我一个UnicodeDecodeError?!!
答案 0 :(得分:1)
UnicodeDecodeError
可能是一个非常头疼的问题。可能有很多原因。
您可以试试其中一些:
如果您使用MySQL
作为数据库,可以使用这样的命令行来创建它:
CREATE DATABASE `mydb` CHARACTER SET utf8 COLLATE utf8_general_ci;
请在此处查看more。
使用nombre
值'OctavodeBásica'创建Nivel对象时,您可以尝试这样的事情:
nivel_obj = Nivel(
nombre=unicode('Octavo de Básica', 'utf-8'),
...
)
在这里阅读more。
你也可以试试encode
Python函数。 here a tutorial
答案 1 :(得分:1)
filter
并没有按照您的意愿行事:
nivel_obj = Nivel.objects.filter(id=nivel_id)
filter
返回一个查询集,而不是单个对象。您无法将其用作ForeignKey
字段的值。我还没有看到为什么会引发您报告的异常,也许是因为在尝试报告异常时没有正确的字符串?
通常,您使用get
来获取单个对象而不是查询集,或者在视图中使用get_object_or_404
快捷方式。但是,您不需要这样做只是为了设置外键关系 - 您可以直接使用ID值进行实例化:
nueva_matricula = Matricula(nivel_id=nivel_id, ano_lectivo=ano_lectivo, alumno=a)
nueva_matricula.save()
如果您的错误仍然存在,我会专注于检查self.nombre
的返回类型。 Django CharField
应该总是返回一个Unicode对象,但是如果你有一些非标准的事情发生并且你将编码的字节串作为nombre
,你的__unicode__
方法将抛出显示的UnicodeDecodeError
。但是使用标准Django不可能做到这一点。