模型对象中的Django UnicodeDecodeError
这是我在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”
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
的返回类型。DjangoCharField
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()