Правильно ли я написал миграцию данных для изменения типа данных?Python

Программы на Python
Anonymous
Правильно ли я написал миграцию данных для изменения типа данных?

Сообщение Anonymous »

Скажем, у меня есть модель TestModel:

Код: Выделить всё

class TestModel(models.Model):
field1 = models.CharField(max_length=255)
field2 = models.IntegerField()

def __str__(self):
return f"{self.field1}"
Но сейчас мне нужно изменить тип поля2 на «Текст». Чтобы не потерять данные в модели TestModel, мне нужно написать миграцию данных.
Поэтому я создаю новую модель NewTestModel:

Код: Выделить всё

class NewTestModel(models.Model):
field1 = models.CharField(max_length=255)
field2 = models.TextField()

def __str__(self):
return f"{self.field1}"
Запустите команду python Manage.py makemigrations
В файле миграции 0006_newtestmodel.py я добавляю функцию copy_data и запускаю ее с помощью миграции.RunPython (copy_data)

Код: Выделить всё

from django.db import migrations, models

def copy_data(apps, database_schema):
TestModel = apps.get_model("data_migrations", "TestModel")
NewTestModel = apps.get_model("data_migrations", "NewTestModel")

for old_object in TestModel.objects.all():
new_object = NewTestModel(
field1 = old_object.field1,
field2 = old_object.field2
)
new_object.save()

class Migration(migrations.Migration):

dependencies = [
('data_migrations', '0005_testmodel'),
]

operations = [
migrations.CreateModel(
name='NewTestModel',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('field1', models.CharField(max_length=255)),
('field2', models.TextField()),
],
),
migrations.RunPython(copy_data)
]
Затем я удаляю модель TestModel и запускаю команды миграции.
После этого я переименовываю NewTestModel в TestModel и еще раз запускаю команды миграции.
p>
Все получилось так, как должно было.
Правильно ли я сделал?

Подробнее здесь: https://stackoverflow.com/questions/786 ... orrect-way

Вернуться в «Python»