Это старый вопрос, но ответ сэкономил мне много усилий. Я просто хочу добавить кое-что.
При создании класса модели для наследования от абстрактной модели миграция Django удалит эту модель.
MyModel(models.Model):
# some fields to be inherited later from the abstract model
author = models.ForeignKey('auth.User')
# other fields specific to this model
Теперь, если вы создадите абстрактную модель:
MyAbstractModel(models.Model):
# fields to be used by children classes
class Meta:
abstract = True
и пусть ваша модель наследуется от него:
MyModel(MyAbstractModel):
author = models.ForeignKey('auth.User')
# other fields specific to this model
Если вы запустите makemigrations и мигрируете в свое приложение, Django удалит эту модель и удалит соответствующую таблицу БД.
Вы можете перехитрить Джанго, закомментировав код этой модели. Django удалит его со всеми остальными последствиями. Теперь вы можете раскомментировать код и снова запустить миграцию, и Django снова создаст таблицу БД.
Однако у вас, вероятно, будет администратор, представления, формы и т. д. для импорта вашей модели. Это означает, что миграция вызовет ошибку, потому что этот класс не может быть найден. Вам придется закомментировать код во всех файлах, в которые импортируется ваша модель.
Проще было бы пропустить комментирование и написать нужную миграцию вручную:
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
# app_label should be your app
# and 000x_the_last_migration is the name of the migration
# it depends on, usually the last one
('app_label', '000x_the_last_migration'),
]
operations = [
# do this for all ForeignKey, ManyToManyField, OneToOneField
# where model_name is obviously the model name and name is the
# field name
migrations.RemoveField(
model_name='mymodel',
name='author',
),
# finally delete the model
migrations.DeleteModel(
name='MyModel',
),
]
Теперь вы можете запустить миграцию:
python manage.py migrate app_label
позже наследовать от абстрактной модели (см. код выше, 3-й блок) и выполнить новую миграцию:
python manage.py makemigrations app_label
Это должно избавить вас от комментирования больших кусков кода. Если вы хотите сохранить данные в таблице БД, вы можете использовать dumpdata
и loaddata
.
TLDR
Это не было пошаговым руководством и требовало опыта работы с Django. Короче говоря, вы должны:
- Создать абстрактную модель
- Напишите миграцию вручную для модели, которая должна наследоваться от абстрактной модели.
- Запустите миграцию (это удалит таблицу БД со всеми записями!)
- Наследовать от абстрактной модели
- Запуск makemigrations и миграция
person
cezar
schedule
25.08.2017