Django - 更改验证器名称会导致迁移中的回溯

时间:2016-12-12 08:56:47

标签: django django-migrations django-validation

我使用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 ,但在更改后,runserver会导致此错误:

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'

为了解决这个问题我猜它是&#39; d足以将所有validate_modificationorder_san_amount更改为validate_resource_san_amount,但我想从概念上来说它是&#39;这是个坏主意。我该如何以正确的方式处理这个问题? - 因此要更改已存在于迁移文件中的验证器名称。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

如果您无法在运行测试时解压缩迁移或遇到此问题(就像我一样),您可以通过将旧名称保留在那里并从中调用新函数来解决此问题。

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

答案 2 :(得分:0)

第一步,去吧,重命名迁移文件中的用法,因为我怀疑它会对你在这里所说的内容产生任何不利影响。

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

  

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

     

更新依赖于已删除迁移的所有迁移,以取决于压缩迁移。

     

删除了压缩迁移的Migration类中的replaceces属性(这就是Django告诉它是一个被压扁的迁移的方式)。