升级到 1.8 后进行迁移时出现 DjangoUnicodeDecodeError

Posted

技术标签:

【中文标题】升级到 1.8 后进行迁移时出现 DjangoUnicodeDecodeError【英文标题】:DjangoUnicodeDecodeError while makemigrations after upgrading to 1.8 【发布时间】:2015-10-04 17:54:26 【问题描述】:

最近我将我的 Django 从 1.6.5 升级到了 1.8.3。我一直在使用 South,所以,在 tutorial 之后,我删除了 South,删除了旧的迁移并运行了 makemigrations。然后我得到了错误:

[mefioo@ibmed-server kariera_naukowa]$ env/bin/python src/manage.py makemigrations
Migrations for 'editcv':
  0001_initial.py:
    - Create model Adresy
    - Create model Affiliacja
    [...all models from models.py...]
    - Create model ZalRo
    - Add field WszysCz to wlasne
    [...so far only ForeignKeys, but not all of them...]
    - Add field user to adresy
Traceback (most recent call last):
  File "src/manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/home/mefioo/public_html/kariera_naukowa/env/lib/python2.7/site-packages/django/core/management/__init__.py", line 338, in execute_from_command_line
    utility.execute()
  File "/home/mefioo/public_html/kariera_naukowa/env/lib/python2.7/site-packages/django/core/management/__init__.py", line 330, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/mefioo/public_html/kariera_naukowa/env/lib/python2.7/site-packages/django/core/management/base.py", line 393, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/mefioo/public_html/kariera_naukowa/env/lib/python2.7/site-packages/django/core/management/base.py", line 444, in execute
    output = self.handle(*args, **options)
  File "/home/mefioo/public_html/kariera_naukowa/env/lib/python2.7/site-packages/django/core/management/commands/makemigrations.py", line 143, in handle
    self.write_migration_files(changes)
  File "/home/mefioo/public_html/kariera_naukowa/env/lib/python2.7/site-packages/django/core/management/commands/makemigrations.py", line 171, in write_migration_files
    migration_string = writer.as_string()
  File "/home/mefioo/public_html/kariera_naukowa/env/lib/python2.7/site-packages/django/db/migrations/writer.py", line 166, in as_string
    operation_string, operation_imports = OperationWriter(operation).serialize()
  File "/home/mefioo/public_html/kariera_naukowa/env/lib/python2.7/site-packages/django/db/migrations/writer.py", line 124, in serialize
    _write(arg_name, arg_value)
  File "/home/mefioo/public_html/kariera_naukowa/env/lib/python2.7/site-packages/django/db/migrations/writer.py", line 75, in _write
    arg_string, arg_imports = MigrationWriter.serialize(item)
  File "/home/mefioo/public_html/kariera_naukowa/env/lib/python2.7/site-packages/django/db/migrations/writer.py", line 303, in serialize
    item_string, item_imports = cls.serialize(item)
  File "/home/mefioo/public_html/kariera_naukowa/env/lib/python2.7/site-packages/django/db/migrations/writer.py", line 377, in serialize
    return cls.serialize_deconstructed(path, args, kwargs)
  File "/home/mefioo/public_html/kariera_naukowa/env/lib/python2.7/site-packages/django/db/migrations/writer.py", line 268, in serialize_deconstructed
    arg_string, arg_imports = cls.serialize(arg)
  File "/home/mefioo/public_html/kariera_naukowa/env/lib/python2.7/site-packages/django/db/migrations/writer.py", line 296, in serialize
    value = force_text(value)
  File "/home/mefioo/public_html/kariera_naukowa/env/lib/python2.7/site-packages/django/utils/encoding.py", line 102, in force_text
    raise DjangoUnicodeDecodeError(s, *e.args)
django.utils.encoding.DjangoUnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 10: ordinal not in range(128). You passed in <django.utils.functional.__proxy__ object at 0x268a9d0> (<class 'django.utils.functional.__proxy__'>)

我检查了,0xc3 是 Ã 或 Ä,我当然不使用(它甚至不存在于波兰字母表中)。

通过的 fk 之一是

wydzial = models.ForeignKey(Wydzial, verbose_name="Wydział")

它包含波兰语'ł',但一切都很好。

我在这里错过了什么?

【问题讨论】:

尝试在模型中使用 unicode 字符串,例如verbose_name=u"Wydział". 我正在尝试对我的前任代码做一些事情,所以出现了混乱,大部分字符串都在他们之前得到了你,我会改变休息,但请注意我没有它的例子通过了。跨度> 好的,没关系,我按照你说的做了,我成功了,非常感谢,我感到羞耻。将其添加为答案,以便我可以投票并关闭此线程:) 【参考方案1】:

如果您在模型中使用 unicode 字符串,您应该避免出现问题,例如verbose_name=u"Wydział"

您可能更愿意从未来的库中导入 unicode_literals,如 recommended by the Django docs。不过,如果将此添加到现有模块中,请小心!

from __future__ import unicode_literals

【讨论】:

【参考方案2】:

Unicode vs python 字符串问题。 Django 文档已经朝着 python 3 的方向走得更远了,所以他们不再有警告你的习惯了。在python2中,在字符串前面加上一个u,例如u"Wydział"。由于您运行的是 2.7,因此您可以尝试from __future__ import unicode_literals。请注意,第二个解决方案可能会破坏您项目中的其他一些内容。

【讨论】:

以上是关于升级到 1.8 后进行迁移时出现 DjangoUnicodeDecodeError的主要内容,如果未能解决你的问题,请参考以下文章

Dart Null-Safety - 执行 dart 迁移以升级到新的 null 安全性时出现范围错误

添加迁移EF Core时出现奇怪错误

Flutter 升级后出现 Flutter Cloud Firestore 错误

升级到 macOS 10.12 (Sierra) 后,使用 Capistrano 部署代码时出现问题,“权限被拒绝(公钥)”。

将 PDFBox 迁移到 2.x 时出现 GetPages 错误

Django 1.7 和 1.8 之间迁移行为的变化