LoginSignup
4
4

More than 5 years have passed since last update.

Django 1.7のモデルマイグレーション内で、モデルの値を更新する

Last updated at Posted at 2015-02-09

マイグレーションを進める場合、戻す場合にどのようにするか説明。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)  
    ]
4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4