【问题标题】:Django UnicodeDecodeError in model object模型对象中的 Django UnicodeDecodeError
【发布时间】:2015-06-17 19:07:30
【问题描述】:

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

确切的错误来自一个名为“Octavo de Bá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

编辑:发现错误

好的,我发现了我的错误,我不会删除问题,因为 django 给我的错误 (UnicodeDecodeError) 完全是误导性的。错误是这个:

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?!!

【问题讨论】:

  • 一般来说,这对我来说都是正确的。您应该为Matricula 上的verbose_name 属性使用Unicode 文字,例如verbose_name = u'matrícula',但我不明白为什么这会产生您所看到的异常。 UnicodeDecodeError 来自于当编码字符串包含非 ascii 字符时尝试混合编码字符串和 Unicode 对象,例如'matr\xc3\xadcula' + u'matrícula',因此某处正在获取名称的编码版本。 Django 自己不会这样做 - 如果您可以显示您的视图代码,我或其他读者可能会帮助发现它。

标签: django encoding


【解决方案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 CharFields 应该总是返回一个 Unicode 对象,但是如果你有一些非常不标准的事情发生并且你得到一个编码为 nombre 的字节串,你的 __unicode__ 方法将抛出 UnicodeDecodeError 所示。但这在标准 Django 中是不可能的。

【讨论】:

  • 你说得对,你回答的那一刻我正在写最后一个编辑。我会接受这个答案,但为什么 UnicodeDecodeError 仍然存在的问题。谢谢。
  • 可能它试图在某处形成异常消息来报告问题,并且某些东西要么从 __unicode__ 方法返回编码字符串,要么在 __unicode__ 中抛出异常。完整的 strack 跟踪可能有助于调试它 - 或者在交互式 shell 或 pdb 中处理类似查询。
【解决方案2】:

UnicodeDecodeError 可能会让人非常头疼。可能有很多原因。

你可以试试这个:


如果您使用MySQL 作为数据库,您可以使用这样的命令行来创建它:

CREATE DATABASE `mydb` CHARACTER SET utf8 COLLATE utf8_general_ci;

在此处查看more


当您使用 nombre 值“Octavo de Básica”创建 Nivel 对象时,您可以尝试以下操作:

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

在此处阅读more


您也可以尝试encode Python 函数。 here a tutorial

【讨论】:

  • 感谢您的链接。我无法接受,因为我使用的是 PSQL。
  • 确保您正在创建一个兼容 utf-8 的数据库。
猜你喜欢
  • 1970-01-01
  • 2017-11-24
  • 2019-10-15
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 2021-03-24
  • 2011-07-22
  • 1970-01-01
相关资源
最近更新 更多