Удаление наследования из модели, сохраняющей идентификаторы
У меня есть два класса, один из которых наследуется от другого
class Drink(models.Model):
....
class Juice(Drink)
....
Теперь, это была ошибка, и я хотел бы удалить наследование и сделать модель Juice обычной моделью Juice(models.Model)
. Однако я хотел бы сохранить последовательность IDs
, которая есть в суперклассе. Из-за наследования суперкласс имеет поле автоматического идентификатора, а подкласс - поле указателя (drink_ptr_id
).
Теперь, когда я просто меняю синтаксис, django пытается добавить поле auto ID в модель сока и хочет, чтобы я установил значение по умолчанию. Очевидная проблема заключается в том, что мне нужно, чтобы последовательность супермодели была скопирована в поле auto ID модели подкласса, и я не могу просто добавить значение по умолчанию. Вторая проблема - которая кажется мне довольно странной - заключается в том, что у подкласса уже есть автоинкрементируемое поле ID, поэтому возникает конфликт между вновь созданным полем и старым полем id.
Я пытался следовать советам, данным в этом посте: Удалить наследование модели и сохранить id во вновь созданном автополе, что практически аналогично проблеме.
Но когда я следую этому совету, я получаю django.core.exceptions.FieldError: Local field u'id' in class clashes with ID
. Я попытался адаптировать ручной переход, изменив имя поля ID
на ID_second
, но затем я получил ошибку, что поле ID_second
находится внутри первичного ключа, что полностью все испортило. Так что после довольно длительной операции я вернулся к тому, с чего начал. У меня довольно много данных, поэтому начинать все с нуля не вариант.
Есть ли способ удалить наследование и сохранить внешние ключи? Если мне нужно предоставить больше информации или объяснить яснее, пожалуйста, LMK. Заранее спасибо за любую помощь.
Измените свою модель.
class Juice(models.Model):
drink_ptr_id = models.AutoField(primary_key=True)
создал новую шему через makemigrations.
После Makemigrations в новой схеме должны быть только AlterField
, а не AddField или DeleteField.
migrate.
После этого вы можете использовать свой сок без других напитков. ;)