Как рефакторить пару полей из одной модели в другую с помощью отношения FK
В настоящее время у меня есть модель
class Car(models.Model):
name = models.CharField(max_length=20)
manufacturer_name = models.CharField(max_length=20)
manufacturer_url = models.URLField()
Теперь я хочу извлечь информацию о производителе в свою собственную модель, чтобы избавиться от лишних данных. Например, так:
class Manufacturer(models.Model):
name = models.CharField(max_length=20)
url = models.URLField()
class Car(models.Model):
name = models.CharField(max_length=20)
manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE)
Однако инструмент миграции Django определяет это как "удаление полей" и "добавление полей". Может ли Django как-то сделать эту миграцию автоматически? Или мне придется писать эти миграции самому. Это кажется распространенным вариантом использования, поэтому я подумал, что, возможно, у Django есть что-то в запасе для ootb.
Нет, насколько мне известно, в django нет ничего, чтобы справиться с этой ситуацией. Я предлагаю сначала не удалять поле manufacturer_name из cars:
class Manufacturer(models.Model):
name = models.CharField(max_length=20)
url = models.URLField()
class Car(models.Model):
name = models.CharField(max_length=20)
manufacturer_name = models.CharField(max_length=20)
manufacturer_url = models.URLField()
manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE)
##then using
python manage.py shell
from app.models import *
getallcars = Car.objects.all()
for car in getallcars:
getmanufacturer,created = Manufacturer.objects.getorcreate(name=car.manufacturer_name ,manufacturer_url =car.manufacturer_url)
Тогда вы можете удалить manufacturer_name и manufacturer_url