模型对象中的Django UnicodeDecodeError

时间:2015-06-17 19:07:31

标签: django encoding

这是我在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?!!

2 个答案:

答案 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不可能做到这一点。