这个错误让我头痛了一个星期,但我找不到解决方法。我继承了用Django编写的旧版应用程序。我熟悉Django,但不是专家。该应用程序可以在Heroku和其他一些Linux发行版的许多不同环境中很好地工作。我们需要在Debian GNU / Linux 10中安装几个新实例。大多数应用程序都能正常运行,但是我们开始在某些命令上出现异常。 很明显,我在标题中遇到了上述错误。其中一个类无法绑定几乎可在任何地方使用的属性。实际上,我写了一个测试命令,该命令模拟了加载过程中失败的大多数对象,并且看不到任何错误。
添加大量调试信息后,我可以将其固定为几个 unicode 方法:
class PrinterAutomaticRule(models.Model):
printer = models.ForeignKey(Printer, on_delete=models.CASCADE, related_name='automatic_rules')
description = models.TextField(u'Descripción', null=True, blank=True)
# ... (mode irrelevant code)
def __unicode__(self):
return u'some text with weird chars ó {0}: {1}'.format(self.printer, self.description
if self.description else u'another text with weird chars ó')
class Printer(models.Model):
restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE, related_name='printers')
name = models.CharField(u'Nombre', max_length=200)
# ... (mode irrelevant code)
def __unicode__(self):
return u'{0} ({1})'.format(self.name, self.restaurant.name)
class Restaurant(models.Model)
# you can imagine the rest
因为这不是英语,所以有些奇怪的字符,并且按照创建它的方式显示在网站上是必需的。如果我们使用所需的任何unicode方法替换一半,该应用程序将立即运行。您可以看到那里还有另一个对象(self.printer),它在其中产生了另一个unicode方法。
此应用程序可在Heroku中运行,并且可在其他环境(包括Windows)中运行。我想我有一个隐藏在某处的环境问题。不幸的是,由于该应用程序具有处理大量数据的糟糕方法,并且有时使用对象表示来过滤掉信息,因此我们无法更改逻辑。这是一个巨大的应用程序,模型中包含成千上万行。
我也无法使用Django产生更多的调试输出,有很多try / catch会在数据库中产生日志记录信息,并且要替换所有这些信息并不容易。我最终重写了很多代码,但这在其他环境中仍然可以正常工作,因此我确定自己会丢失一些东西。
如果我替换了该特定代码,则还有另一个Unicode失败,而我替换了下一个,则还有一个失败,依此类推。同样,这在其他许多地方也很好。
更多细节,此应用程序使用Postgres SQL。我知道Postgress对Unicode的处理非常好,甚至可以在不匹配的情况下进行转换,而不会失败。
编辑
添加更多信息。无论如何,总是有一条特定的路线总是失败。
for printer in order.restaurant.active_printers.filter(type__description=PrinterType.fiscal_description):
jobs = [print_job for print_job in [rule.get_print_job(order, now=now) for rule in printer.active_rules()]
if print_job]
if jobs:
fiscal_print_job = jobs[0]
这有点令人费解,但总是失败。原因是在某些时候Django在rule或active_rules(最终在我上面提到的PrinterAutomaticRules的代码中)或打印机中调用unicode。
答案 0 :(得分:0)
即使我还在做一些研究,这也是我发现的。 我使用PyCharm进行编码,因此编码很好。众所周知,GIT将所有内容存储为二进制Blob,因此Blob本身没有转换。 当我克隆一个特定分支而不使用结帐来回操作时,它完美地工作。当我克隆整个存储库并来回切换到不同的分支时,总是会发生此问题。在这种情况下,整个编码变得混乱,Django失败的原因有所不同,它无法处理编码,并且无法绑定我的属性。 在两种情况下一切正常:
我尝试了Ubuntu,Debian和某些版本的组合,但全部失败。我还找不到根本原因。