В том случае, если ваши данные находятся в промежуточной таблице, я бы порекомендовал вам сделать следующее.
- Добавить и временный столбец к вашей
A
таблице
class A(models.Model):
name = models.CharField(max_length=255)
data = models.ManyToManyField(B, related_name='data', through='C')
# the on_delete part is not related, I added it just to avoid errors.
tmp_data = models.ForeignKey(B, on_delete=models.DO_NOTHING)
и затем python manage.py makemigrations
Создайте пустой файл миграции и заставьте его выполнить этот код, чтобы скопировать все
A-B
данные отношения из таблицы
C
в таблицу
A
# Command
python manage.py makemigrations <<<APP_NAME>>> --empty
# Inside Empty migrations file
def migrate_c_to_a(apps, schema_editor):
C = apps.get_model('<<<APP NAME>>>', 'C')
for c in C.objects.all().iterator():
a = c.a
a.tmp_data = c.b
a.save()
class Migration(migrations.Migration):
...
...
operations = [
migrations.RunPython(migrate_c_to_a)
]
Удалите
data
столбец из вашей
A
модели и
makemigtations
Переименуйте
tmp_data
столбец в
data
на вашей
A
модели, затем
makemigrations
Осторожно, убедитесь, что makemigrations не удалит tmp_data
и data
, а затем добавит новое поле data
, это приведет к потере данных, я покажу вам, как это сделать, во фрагменте ниже.
Внутри файла миграции, если это произошло
...
operations = [
migrations.RemoveField(
model_name='a',
name='tmp_data',
),
migrations.RemoveField(
model_name='a',
name='data',
),
migrations.AddField(
model_name='a',
name='data',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='tsting.B'),
),
]
...
Измените его на
...
operations = [
migrations.RemoveField(
model_name='a',
name='data',
),
migrations.RenameField(
model_name='a',
old_name='tmp_data',
new_name='data'
),
]
...
python manage.py migrate
Это должно сделать это навсегда. после этого, если вы хотите удалить таблицу C
, вам решать, так как данные внутри нее безопасно перенесены в таблицу A