I have a production database and need to keep safe the data. I want to change a Field in model and convert all data inside that database with this change.
Old field<
Safest way that I always do is:
field_name_new = models.PositiveIntegerField()
field_name
value and move the
converted value to field field_name_new
)field_name_new
is usedfield_name
there is only one bad side: you may loose some data in steps 4 and 5. but you can replicate these data to new field basically
In the past, I've always done this with the help of Djangos RunPython operation. Create a custom migration that handles the following.
def migrate_time_to_positive_int(apps, schema_editor):
MyModel = apps.get_model('myapp', 'MyModel')
for mm in MyModel.objects.all():
field_old_time = mm.field_name_old
field_new_int = field_old_time.total_seconds() / 60
mm.field_name = field_new_int
mm.save()
class Migration(migrations.Migration):
operations = [
migrations.RenameField(
model_name='mymodel',
old_name='field_name',
new_name='field_name_old',
),
migrations.AddField(
model_name='mymodel',
name='field_name',
field=models.PositiveIntegerField(),
),
migrations.RunPython(migrate_time_to_positive_int),
migrations.RemoveField(
model_name='mymodel',
name='field_name_old',
)
]
field_name_old.total_seconds() / 60 might need to be adjusted, but you get the idea.