我使用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;这是个坏主意。我该如何以正确的方式处理这个问题? - 因此要更改已存在于迁移文件中的验证器名称。
答案 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告诉它是一个被压扁的迁移的方式)。