Django中的UnicodeDecodeError模型对象(Django UnicodeDecod

2019-10-23 09:50发布

这是另一种的UnicodeDecodeError我在Django处理。 我找不到解决问题的方法。

我试图创建一个对象:

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)

确切的错误来自于有一个名字类似这样的“八开德BASICA”,我不能用它,而无需一个的UnicodeDecodeError工作“NIVEL”对象。

这是错误:

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

编辑:发现错误

OK,我发现我的错误,我不会删除的问题会导致错误(的UnicodeDecodeError)Django最让我完全是误导。 错误是这个:

nivel_obj = Nivel.objects.filter(id=nivel_id) <---
nueva_matricula = Matricula(nivel=nivel_obj, ano_lectivo=ano_lectivo, alumno=a)

我无法保存一个新的对象与NIVEL =查询集,而不是NIVEL = NivelObject。

它应该是:

nivel_obj = Nivel.objects.get(id=nivel_id)

我的错。

但是,为什么在地球上的Django给我一个UnicodeDecodeError错误?!

Answer 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 S的关系总是返回一个Unicode对象,但如果你已经得到的东西真的非标准发生,你得到一个编码字节字符串作为nombre ,你__unicode__方法将抛出UnicodeDecodeError所示。 但是,这不应该是相对于标准的Django。



Answer 2:

UnicodeDecodeError可能是一个很艰难的头痛。 可能是一个很大的原因。

你可以试着用一些这样的:


如果你正在使用MySQL数据库,你可以使用命令行像这样来创建它:

CREATE DATABASE `mydb` CHARACTER SET utf8 COLLATE utf8_general_ci;

参见更多在这里。


当您创建与该NIVEL对象nombre值“八开德BASICA”,你可以尝试这样的事:

nivel_obj = Nivel(
    nombre=unicode('Octavo de Básica', 'utf-8'),
    ...
)

阅读更多的在这里。


您也可以尝试在encode Python函数。 这里的教程



文章来源: Django UnicodeDecodeError in model object