在 django 迁移期间处理数据?

Moh*_*ati 5 python django django-models django-migrations

class Material(models.Model):
    name = models.CharField(max_length=50, blank=False)
    short_name = models.CharField(max_length=2, blank=False, unique=False, default='Al')
   
    def __str__(self):
        return self.name

    class Meta:
        db_table = 'material'
Run Code Online (Sandbox Code Playgroud)

我创建了这个模型。假设我添加了一个名为的新字段

status = models.IntergerField(default=1)
Run Code Online (Sandbox Code Playgroud)

之后,如果我运行命令 python manage.py makemigrations,那么 django 将在表中添加一个新的字段状态。假设表中有 3 行,则值如下:

1. Material1, M1, 1
2. Material2, M2,1
3. Material3, M3, 1
Run Code Online (Sandbox Code Playgroud)

通过这次迁移,我还想更改每一行的状态并添加新行,就像

1. Material1, M1, 1
2. Material2, M2,0
3. Material3, M3, 0
4. Material4, M4, 1
Run Code Online (Sandbox Code Playgroud)

有什么方法可以处理 django 中模式迁移过程中的数据操作吗?

You*_*Kim 10

您可以使用特殊操作(例如 )来设置单独的值django.db.migrations.RunPython

(参考:https ://docs.djangoproject.com/en/3.1/ref/migration-operations/#runpython )

假设您已将字段“状态”添加到模型中,并且已经完成迁移(正在执行manage.py makemigrations)。

现在,执行manage.py makemigrations your_app --empty. 然后,编辑自动创建的迁移文件,如下所示。

from django.db import migrations


def set_individual_status(apps, schema_editor):
    Material = apps.get_model("your_app", "Material")

    material_ids_status_0 = [2, 3]
    material_ids_status_1 = [1, 4]

    Material.objects.filter(id__in=material_ids_status_0).update(status=0)
    Material.objects.filter(id__in=material_ids_status_1).update(status=1)


class Migration(migrations.Migration):

    dependencies = [("your_app", "00xx_auto_20210106_1527")]

    operations = [
        migrations.RunPython(set_individual_status, migrations.RunPython.noop)
    ]
Run Code Online (Sandbox Code Playgroud)

然后,执行manage.py migrate.