[解決済み] Django 1.7とデータマイグレーションで初期データを読み込む
質問
私は最近 Django 1.6 から 1.7 に乗り換え、migrations を使い始めました (South は使ったことがありませんでした)。
1.7 以前、私は初期データをロードするために
fixture/initial_data.json
というファイルを読み込んでいましたが、これは
python manage.py syncdb
コマンド(データベース作成時)で読み込まれたものです。
現在、私はmigrationsを使い始めましたが、この動作は非推奨です :
アプリケーションが migrations を使っている場合、フィクスチャの自動読み込みは行われません。 Django 2.0 では migrations がアプリケーションに必要になるため、この動作は非推奨とされています。アプリの初期データをロードしたい場合は、データマイグレーションで行うことを検討し てください。 ( https://docs.djangoproject.com/en/1.7/howto/initial-data/#automatically-loading-initial-data-fixtures )
この 公式ドキュメント には、その方法についての明確な例がないので、私の質問は:
データ移行を使用してこのような初期データをインポートする最良の方法は何でしょうか。
-
を複数回呼び出すPythonコードを書いてください。
mymodel.create(...)
, -
Django の関数を使うか書くか (
を呼び出すように
loaddata
を呼び出して、JSONフィクスチャファイルからデータをロードします。
私は2番目のオプションを好みます。
今はDjangoがネイティブでできるようなので、Southは使いたくないです。
どのように解決するのですか?
更新 : このソリューションが引き起こす可能性のある問題については、以下の @GwynBleidD のコメントを参照してください。また、将来のモデル変更に対してより耐久性のあるアプローチについては、以下の @Rockallite の回答を参照してください。
フィクスチャファイルが
<yourapp>/fixtures/initial_data.json
-
空のマイグレーションを作成します。
Django 1.7 では。
python manage.py makemigrations --empty <yourapp>
Django 1.8+ では、名前を指定することができます。
python manage.py makemigrations --empty <yourapp> --name load_intial_data
-
マイグレーションファイルの編集
<yourapp>/migrations/0002_auto_xxx.py
2.1. Djangoに触発されたカスタム実装
loaddata
(最初の回答)。import os from sys import path from django.core import serializers fixture_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../fixtures')) fixture_filename = 'initial_data.json' def load_fixture(apps, schema_editor): fixture_file = os.path.join(fixture_dir, fixture_filename) fixture = open(fixture_file, 'rb') objects = serializers.deserialize('json', fixture, ignorenonexistent=True) for obj in objects: obj.save() fixture.close() def unload_fixture(apps, schema_editor): "Brutally deleting all entries for this model..." MyModel = apps.get_model("yourapp", "ModelName") MyModel.objects.all().delete() class Migration(migrations.Migration): dependencies = [ ('yourapp', '0001_initial'), ] operations = [ migrations.RunPython(load_fixture, reverse_code=unload_fixture), ]
2.2. のよりシンプルな解決策
load_fixture
をよりシンプルにしました (@juliocesar さんの提案による)。from django.core.management import call_command fixture_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../fixtures')) fixture_filename = 'initial_data.json' def load_fixture(apps, schema_editor): fixture_file = os.path.join(fixture_dir, fixture_filename) call_command('loaddata', fixture_file)
カスタムディレクトリを使用したい場合に便利です。
2.3. 最もシンプル。 呼び出し
loaddata
でapp_label
は、フィクスチャを<yourapp>
'sfixtures
のディレクションを自動的に行います。from django.core.management import call_command fixture = 'initial_data' def load_fixture(apps, schema_editor): call_command('loaddata', fixture, app_label='yourapp')
を指定しない場合
app_label
を指定しないと、loaddata はfixture
からファイル名を読み込もうとします。 全て アプリのフィクスチャディレクトリ(これはおそらく必要ないでしょう)。 -
実行する
python manage.py migrate <yourapp>
関連
-
[解決済み] cURLでJSONデータをPOSTするにはどうすればよいですか?
-
[解決済み] jQueryでフォームデータをJavaScriptオブジェクトに変換する
-
[解決済み】Djangoでnull=Trueとblank=Trueの違いは何ですか?
-
[解決済み] django.db.migrations.exceptions.InconsistentMigrationHistory
-
[解決済み] Pythonによる一対のクロスプロダクト [重複] (英語)
-
[解決済み] Pythonの検索パスを他のソースに展開する
-
[解決済み] Pythonでファイルの読み込みと上書きをする
-
[解決済み] Python の sorted() はどのようなアルゴリズムを使っているのですか?重複
-
[解決済み] pipの依存性/必要条件をリストアップする方法はありますか?
-
[解決済み] Django 1.7でユニットテストを実行する際にmigrationsを無効にする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] pandasのDataFrameから空のセルを含む行を削除する
-
[解決済み] SQLAlchemy: 日付フィールドをフィルタリングする方法は?
-
[解決済み] python-requests モジュールからのすべてのリクエストをログに記録します。
-
[解決済み] Pythonで0xを使わずにhex()を使うには?
-
[解決済み] Django 1.7で初期マイグレーションからマイグレートバックする方法は?
-
[解決済み] PyMongoで.sortを使用する
-
[解決済み] Pythonで、ウェブサイトが404か200かを確認するためにurllibをどのように使用しますか?
-
[解決済み] Pythonの文字列の前にあるbという接頭辞は何を意味するのですか?
-
[解決済み] djangoのQueryDictをPythonのDictに変更するには?
-
[解決済み] Alembicアップグレードスクリプトでインサートやアップデートを実行するにはどうすればよいですか?