Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
模型对象中的Django UnicodeDecodeError_Django_Encoding - Fatal编程技术网

模型对象中的Django UnicodeDecodeError

模型对象中的Django UnicodeDecodeError,django,encoding,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”

这是我在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)
编辑:发现错误

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

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


但是,到底为什么django会给我一个独角兽

UnicodeDecodeError可能是一个非常头痛的问题。可能有很多原因

您可以尝试以下方法:


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

CREATE DATABASE `mydb` CHARACTER SET utf8 COLLATE utf8_general_ci;
看这里


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

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



您还可以尝试使用
encode
Python函数

过滤器
没有执行您希望它执行的操作:

nivel_obj = Nivel.objects.filter(id=nivel_id)
filter
返回查询集,而不是单个对象。不能将其用作
ForeignKey
字段的值。我还不明白为什么这会引发您正在报告的异常,可能是在它试图报告异常时没有正确地进行字符串化

通常,您会使用
get
获取单个对象,而不是查询集,或者在视图中,有时使用
get\u object\u或\u 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
的bytestring,那么
\uuuuUnicode\uuuuu
方法将抛出所示的
UnicodeDecodeError
。但这在标准Django中是不可能的。

一般来说,我觉得这一切都是正确的。您应该在
Matricula
上的
verbose\u name
属性中使用Unicode文本,例如
verbose\u name=u'matrícula'
,但我不明白为什么会产生您看到的异常
UnicodeDecodeError
源于当编码字符串包含非ascii字符时尝试混合编码字符串和Unicode对象,例如
'matr\xc3\xadcula'+u'matrícula'
,因此某处获得了名称的编码版本。Django本身并没有做到这一点——如果你能显示你的视图代码,我或其他读者可能会帮你找到它。谢谢你的链接。我不能接受它,因为我使用的是PSQL。请确保您正在创建一个与utf-8兼容的数据库。您是对的,在您回答时我正在编写最后一次编辑。我会接受这个答案,但为什么UnicodeDecodeError仍然存在的问题。Thnx.可能是它试图在某个地方形成一条异常消息来报告问题,而某个东西正在从
\uuuuUnicode\uuuUnicode
方法返回一个编码字符串,或者正在
\uuUnicode\uuUnicode
中抛出异常。完整的strack跟踪可能有助于对其进行调试,或者在交互式shell或pdb中处理类似的查询。
nivel_obj = Nivel.objects.filter(id=nivel_id)
nueva_matricula = Matricula(nivel_id=nivel_id, ano_lectivo=ano_lectivo, alumno=a)
nueva_matricula.save()