【问题标题】:Django - changing validator name causes traceback in migrationDjango - 更改验证器名称会导致迁移中的追溯
【发布时间】:2017-04-27 02:28:38
【问题描述】:

我将 Django 1.9.2 与 python 3.4.2 一起使用。

在开发生命周期的前半部分,我有这段代码:

class ModificationOrder(ERN):
...
    san_amount = models.IntegerField(default=0, \
    validators=[validate_modificationorder_san_amount])

,我创建了一个初始迁移,导致 0001_initial.py 文件中有这一行:

migrations.CreateModel(
    ...
    fields = [
        ...
        ('san_amount', models.IntegerField(default=0, validators=[shop.validators.validate_modificationorder_san_amount])),
    ])

。后来我进行了一些迁移,并从模型中删除了 san_amount 字段,但这可能与我的问题无关。

现在我尝试将验证器的名称更改为 validate_resource_san_amount,但更改后运行服务器会导致此错误:

python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).
Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0x7f8ec1a5a510>
Traceback (most recent call last):
  File "/home/csa.virtualenvs/sccdb34/lib/python3.4/site-packages/django/utils/autoreload.py", line 226, in wrapper
fn(*args, **kwargs)
  File "/home/csa/.virtualenvs/sccdb34/lib/python3.4/site-packages/django/core/management/commands/runserver.py", line 117, in inner_run
self.check_migrations()
  File "/home/csa/.virtualenvs/sccdb34/lib/python3.4/site-packages/django/core/management/commands/runserver.py", line 163, in check_migrations
executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
  File "/home/csa/.virtualenvs/sccdb34/lib/python3.4/site-packages/django/db/migrations/executor.py", line 20, in __init__
self.loader = MigrationLoader(self.connection)
  File "/home/csa/.virtualenvs/sccdb34/lib/python3.4/site-packages/django/db/migrations/loader.py", line 49, in __init__
self.build_graph()
  File "/home/csa/.virtualenvs/sccdb34/lib/python3.4/site-packages/django/db/migrations/loader.py", line 170, in build_graph
self.load_disk()
  File "/home/csa/.virtualenvs/sccdb34/lib/python3.4/site-packages/django/db/migrations/loader.py", line 105, in load_disk
migration_module = import_module("%s.%s" % (module_name, migration_name))
  File "/home/csa/.virtualenvs/sccdb34/lib/python3.4/importlib/__init__.py", line 109, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 2254, in _gcd_import
  File "<frozen importlib._bootstrap>", line 2237, in _find_and_load
  File "<frozen importlib._bootstrap>", line 2226, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 1200, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 1129, in _exec
  File "<frozen importlib._bootstrap>", line 1471, in exec_module
  File "<frozen importlib._bootstrap>", line 321, in _call_with_frames_removed
  File "/home/csa/git/sccdb/sccdb/shop/migrations/0001_initial.py", line 12, in <module>
class Migration(migrations.Migration):
  File "/home/csa/git/sccdb/sccdb/shop/migrations/0001_initial.py", line 226, in Migration
('san_amount', models.IntegerField(default=0, validators=[shop.validators.validate_modificationorder_san_amount])),
AttributeError: 'module' object has no attribute 'validate_modificationorder_san_amount'

.

为了解决这个问题,我想将所有 validate_modificationorder_san_amount 更改为 validate_resource_san_amount 就足够了,但我想从概念上讲这是个坏主意。我应该如何以正确的方式处理这个问题? - 所以要更改已经在迁移文件中的验证器名称。

【问题讨论】:

  • 是的,成功了。在这种情况下,我也会手动编辑迁移文件。

标签: django django-migrations django-validation


【解决方案1】:

手动编辑迁移文件对我有用。只需转到错误中提到的迁移文件并删除验证器部分即可。

【讨论】:

  • 这可能是个好主意,但不幸的是,这是一个太老的问题,无法记住......
  • 我知道。刚刚为现在可能偶然发现这个问题的人添加了它。
【解决方案2】:

如果您还不能取消迁移或在运行测试时遇到此问题(就像我所做的那样),您可以通过保留旧名称并从中调用新函数来解决此问题。

# Legacy name needed by migration 0001_initial.py
def validate_modificationorder_san_amount(value):    
    return validate_resource_san_amount(value)

【讨论】:

    【解决方案3】:

    第一步,继续,重命名迁移文件中的用法,因为我怀疑它会对您在此处所说的内容产生任何不利影响。

    但更重要的是,它会对squashmigrations 有所帮助。文档中写的部分步骤。

    删除它替换的所有迁移文件。

    将所有依赖于已删除迁移的迁移更新为依赖于压缩的迁移。

    删除压缩迁移的 Migration 类中的 replaces 属性(这是 Django 告诉它是压缩迁移的方式)。

    【讨论】:

    • 但不仅如此,它还有助于运行服务器! ;-) 我认为 squashmigrations 部分与问题无关。
    • @AlexanderTyapkov - 这与运行服务器无关,除了操作员看到错误的地方。整个问题是迁移文件中引用了不再适用的代码。因此压缩迁移。
    • 开个玩笑。通过运行服务器,我的意思是在更正迁移文件之后,他不仅能够压缩迁移,而且还希望能够运行服务器。唯一的问题是作者没有询问有关压缩迁移的问题。他在迁移文件中只有一个小问题。
    • 我只是不明白为什么运行服务器会从旧的迁移文件中损坏?它有什么用?它检查什么?南方的时候也是这样吗?我不相信。
    • @user2194805 - 恐怕我没有使用 south,但我很确定 runserver 会检查迁移
    猜你喜欢
    • 2021-04-26
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 2011-09-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    相关资源
    最近更新 更多