2016-05-22 7 views
3

私はdjango 1.9.6を使用しています。私は最近マイグレーションを削除し、migrate --run-syncdbmakemigrations my_appを実行しました。makemigrationsはモデルの変更を検出しません

models.py:今日、私は私のモデルの一つに新しいフィールドを追加

value = models.PositiveSmallIntegerField(null=True) 

私は変更を移行しようとしましたが、変更をmakemigrations検出されません。それは開発版なので、私は再同期することができます(私はデータを保存する必要はありません)が、--run-syncdbを実行しても再度検出されません。

これはなぜ移行しないのですか?

答えて

6

移行を削除しないでください。squash them。おそらくあなたが混乱させる可能性のあるファイルを単に削除した場合、回復する最も簡単な方法は、コードを再同期してファイルを元に戻すことです。より複雑なルートは、django_migrationsテーブルからすべてのレコードを削除して、最初からマイグレーションを再初期化することですが、実際に入るよりも多くのステップ/問題があり、推奨しません。

makemigrationsが変更を検出していない理由は、そのアプリケーションに移行フォルダがないためです。 python manage.py makemigrations your_app --initialを実行すると、マイグレーションが検出されて生成されるか、ファイルとdjango_migrationsテーブルの違いにより、マイグレーションが発生する可能性があります。

--run-syncdbコマンドは、通常は実際に展開する前にデータを気にする必要はありませんが、移行を使用した後はもう--run-syncdbコマンドを使用しないでください。例えば、初期の開発時に、ここで私が代わりにマイグレーションを扱うのすべてのモデルチェンジを実行するコードは次のとおりです。

dropdb mydb && createdb mydb && python manage.py migrate --run-syncdb && python manage.py loaddata initial 

私はfixtures file内のすべての初期データを保存し、コマンドは、データベース全体を一掃、--run-syncdbを再構築します実際の移行ファイルをスキップしながら初期データがロードされます。

したがって、データを気にせず、簡単にフィクスチャに移動できるのであれば、DBを削除して再作成することもできます。すべての移行フォルダを自由に削除することができます。また、あなたが実際に移動して移行を使用するまで移動する必要がある場合は、上記のコマンドを使用することができます。 DJANGO 1.11

FOR

UPDATE私は、Djangoの1.11を使用して開始し、フレームワークのモデルに依存していると、実際の移行を持っていない場合は、テストフレームワークは失敗することに気づきました。これは私がすべてを拭き取り、まだ開発中にやり直すために使用している新しいコマンドです。

dropdb yourdb && createdb yourdb && find . -name "migrations" -type d -prune -exec rm -rf {} \; && python manage.py makemigrations name every app you use seperated by space && python manage.py migrate && python manage.py loaddata initial

私は私のプロジェクトのルートにbuilddb.shでこれを入れて(次のmanage.pyに)ので、私はちょうど./builddb.shを実行することができます。デプロイ時に削除して、事故がないようにしてください!

+0

Right Way To Do™の包括的な説明をありがとう。 'django.contrib.auth'を使ってこれを試している人は、' ./manage.py migrate auth'も忘れないでください。 – Escher

10

その後、__init__ 以外のすべての過去の移行ファイルと__pycache__ファイルを削除します:DBはmodel.pyのコードと同じであることを確認してください(新しい変更を除く)その後

python manage.py makemigrations yourApp 

をし、次の行を実行します:今

python manage.py migrate --fake-initial 

はmodel.py内のすべての変更内容を追加して実行し、次の行:

python manage.py makemigrations 
python manage.py migrate 

よろしくお願いします。 クリスチャン

3

私は同じ問題がありました。モデルに追加しようとしていたフィールドと同じ名前のモデルにプロパティが定義されていることがわかりました。モデルに、追加しようとしているフィールドと同じ名前のモデルプロパティ/メソッドがないことを確認します。

関連する問題