2016-12-12 2 views
2

私はPython 3.4.2でDjango 1.9.2を使用します。Django - バリデータ名を変更すると、マイグレーション時にトレースバックが発生する

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フィールドを削除しましたが、おそらくそれは私の問題に関連していません。

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_resource_san_amountが、結果のrunserverこのエラーを、それを変更した後にバリデータの名前を変更しようとしました。

問題を解決するには、すべてのvalidate_modificationorder_san_amountをvalidate_resource_san_amountに変更するだけで十分ですが、構想的には悪い考えです。私はこの問題を正しい方法でどのように処理すべきですか? - すでにマイグレーションファイルに入っているバリデーター名を変更する。

+0

はい、作成してください。そのような場合は、マイグレーションファイルを手動で編集します。 –

答えて

0

ステップ1、ここをクリックして、マイグレーションファイルの使用法名を変更してください

それ以上に、それはsquashmigrationsに役立ちます。ドキュメントに書かれている手順の一部。

Deleting all the migration files it replaces.

Updating all migrations that depend on the deleted migrations to depend on the squashed migration instead.

Removing the replaces attribute in the Migration class of the squashed migration (this is how Django tells that it is a squashed migration).

+0

それ以上に、それはサーバーを実行するのに役立ちます! ;-)私は恥ずかしがり屋を持つ部分は質問に関連していないと思う。 –

+0

@AlexanderTyapkov - これは、オペレーションがエラーを見る場所以外のrunserverとは関係ありません。全体的な問題は、移行ファイルには、もはや適用されないコードへの参照があることです。それゆえ、移行を激しくする。 – Sayse

+0

それは冗談だった。 runserverでは、マイグレーションファイルを修正した後に、彼は厄介な問題だけでなく、うまくいけばサーバーを動かすことができるということです。唯一のことは、作者がマイグレーションを嫌がることを尋ねなかったことです。彼はマイグレーションファイルには小さな問題しかありません。 –

1

(私が行ったように)あなたがまだ移行を離れて押しつぶすかのテストを実行するときに、この問題に実行できない場合は、あなたがそこに古い名前を残して、そこから新しい関数を呼び出すことによってこの問題を回避することができます。

# Legacy name needed by migration 0001_initial.py 
def validate_modificationorder_san_amount(value):  
    return validate_resource_san_amount(value) 
関連する問題