マイグレーションを進める場合、戻す場合にどのようにするか説明。South以前の書き方とはやや異なりますが、簡単な関数を書くだけで処理することが出来ます。
手順は以下の2つ。
- マイグレーションを進める場合、戻す場合、それぞれで利用する関数を作成する
- Migrationクラスの
operations
にフックを追加する
ユーザ設定の項目に単位が含まれており、その値を変更するようなマイグレーション例。
0002_add_distance_unit.py
def apply_unit_settings(apps, schema_editor):
"""マイグレーションを進める場合に実行する関数
"""
# user_settingsアプリからUserSettingsというモデルクラスを取得する
UserSettings = apps.get_model('user_settings', 'UserSettings')
# モデルオブジェクト全ての`distance_unit`を、`unit`の値を利用して書き換える
for settings in UserSettings.objects.all():
if settings.unit == 'metric':
settings.distance_unit = 'km'
elif settings.unit == 'imperial':
settings.distance_unit = 'mile'
settings.save()
def unapply_unit_settings(apps, schema_editor):
"""マイグレーションを戻す場合に実行する関数
"""
UserSettings = apps.get_model('user_settings', 'UserSettings')
for settings in UserSettings.objects.all():
if settings.distance_unit == 'km':
settings.unit = 'metric'
else:
settings.unit = 'imperial'
settings.save()
Migration
クラスの最後にmigrations.RunPython
を追加します。
0002_add_distance_unit.py
class Migration(migrations.Migration):
dependencies = [
('user_settings', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='usersettings',
name='distance_unit',
field=models.CharField(choices=[('km', 'KM'), ('mile', 'Mile')], null=True, default='km', max_length=8, verbose_name='Distance uni
t'),
preserve_default=True,
),
migrations.AddField(
model_name='usersettings',
name='temperature_unit',
field=models.CharField(choices=[('celsius', 'Celsius'), ('fahrenheit', 'Fahrenheit')], null=True, default='celsius', max_length=10
,
verbose_name='Temperature unit'),
preserve_default=True,
),
# 以下の行を足します
migrations.RunPython(apply_unit_settings, unapply_unit_settings)
]