Сохранение данных при внесении изменений в поля модели в django
У меня есть две модели, которые являются Contact и UpdateInfo. Модель Update является отношением foreignkey с моделью Contact, как показано ниже:
class Contacts(models.Model):
full_name = models.CharField(max_length=100, blank=True)
notes = RichTextField(blank=True)
/............./
class UpdateInfo(models.Model):
contacts = models.ForeignKey(Contacts,on_delete=models.CASCADE, related_name='update_info')
updated_at = models.DateTimeField(auto_now=True)
modified_by = models.CharField(max_length=100, blank=True)
Теперь мне нужно поместить поле notes
в модель UpdateInfo и удалить из модели Contacts. Потому что теперь требования пользователей изменились, и им нужно добавлять заметки в существующие заметки, и они хотят видеть, кто и когда добавил заметку с приложенными заметками.
Но проблема в том, что если я удалю поле Notes из Contacts и добавлю его в модель Updateinfo, то в производстве будет много данных и данные поля Notes будут потеряны.
Теперь как мы можем запустить migrate таким образом, чтобы я добавил поле Notes в модель Updatinfo и одновременно мигрировал данные? Это то, что делают dev ops или мы должны это сделать? Потому что обычно dev ops переносят данные на рабочий сервер из staging area.
Мне нужно мнение эксперта по этому вопросу.
Вы можете создать два файла миграции: 0002_add_notes_to_updateinfo.py
и 0003_remove_notes_from_contact.py
первый добавит поле в модель UpdateInfo
и затем выполнит функцию для миграции старых данных, после чего во втором файле миграции вы можете удалить старое поле.
0002_add_notes_to_updateinfo.py:
from django.db import migrations
def migrate_old_data(apps, schema_editor):
Contacts = apps.get_model('yourappname', 'Contacts')
UpdateInfo = apps.get_model('yourappname', 'UpdateInfo')
for contacts in Contacts.objects.all():
UpdateInfo.objects.filter(contacts=contacts).update(notes=contacts.notes)
class Migration(migrations.Migration):
dependencies = [
#dependencies here,
]
operations = [
migrations.AddField(
model_name='updateinfo',
name='notes',
field=RichTextField(blank=True),
preserve_default=False,
),
migrations.RunPython(migrate_old_data),
]
0003_remove_notes_from_contact.py:
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('yourapp', '0002_add_notes_to_updateinfo'),
]
operations = [
migrations.RemoveField(
model_name='contacts',
name='notes',
),
]