Удаление наследования из модели, сохраняющей идентификаторы

У меня есть два класса, один из которых наследуется от другого

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.

После этого вы можете использовать свой сок без других напитков. ;)

Вернуться на верх