Django 1.7 - makemigrations, создающие миграцию для неуправляемой модели
Я создаю некоторые динамические модели Django в своем приложении, и все, кажется, работает как ожидалось, кроме системы миграции.
Если я создаю динамическую модель Django и задаю managed = False, команда Django makemigrations
все еще создает миграцию для этой новой модели. Миграция выглядит примерно так:
class Migration(migrations.Migration):
dependencies = [
('atom', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='books',
fields=[
],
options={
'db_table': 'books',
'managed': False,
},
bases=(models.Model,),
),
]
Если я не создаю перенос, когда я запускаю python manage.py migrate
, я вижу следующее сообщение (с большими страшными красными буквами):
Your models have changes that are not yet reflected in a migration, and so won't be applied.
Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them.
Есть ли способ сообщить системе миграции в Django 1.7 игнорировать неуправляемые модели вместе? или, возможно, значение migrations = False
в мета-классе моделей?
ОБНОВЛЕНИЕ: для пояснения, я использую метод для создания моих динамических моделей, аналогичных тем, которые описаны в следующих местах:
Этот метод отлично подходит для создания моих динамических моделей на основе информации, хранящейся в моих моделях конфигурации (https://code.djangoproject.com/wiki/DynamicModels#Adatabase-drivenapproach). Мне пришлось регистрировать сигнал, чтобы очистить кэш модели django, чтобы поймать изменения в моделях при изменении экземпляра конфигурации, но все, кажется, работает отлично, за исключением того факта, что для этих моделей создаются миграции. Если я удалю одну из конфигураций, и модель будет удалена из кеша Django, миграция должна быть обновлена снова, удалив модель, которой она не должна заботиться.
Эти динамические модели не используются в приложении конкретно. Нет, где в коде я ссылаюсь на модель книг (из приведенного выше примера). Они генерируются во время выполнения и используются для чтения информации из устаревших таблиц, к которым они предоставляют доступ.
Ответы
Ответ 1
Короткий ответ заключается в том, что Django для этого не создан. означает, что Django не будет создавать или удалять таблицу для него - ничего больше.
Тем не менее, если у вас нет обычных моделей рядом с этими динамическими моделями в одном приложении, вы можете условно добавить приложение в INSTALLED_APPS
в settings.py
:
if not ('makemigrations' in sys.argv or 'migrate' in sys.argv):
INSTALLED_APPS += (
'app_with_dynamic_models',
'another_app_with_dynamic_models',
)
Это должно заставить Django игнорировать приложение при создании и запуске миграции. Однако в конечном итоге вам придется создавать и запускать миграции для моделей, если вы хотите их использовать, поскольку возможность иметь приложения, которые не используют миграции, предназначена для уйти в Django 1.9. Могут ли ваши динамические модели быть реорганизованы для использования contenttypes framework?
Ответ 2
Я предлагаю вам заменить сгенерированную операцию migrations.CreateModel
на вашу собственную, которая всегда отражает фактическое состояние модели. Таким образом, никаких изменений состояния не должно быть обнаружено.
class CreateDynamicModel(CreateModel):
def __init__(self):
# ... dynamically generate the name, fields, options and bases
super(CreateDynamicModel, self).super(
name=name, fields=fields, options=optins, bases=bases
)
Ответ 3
Возможно, вы можете написать настраиваемый маршрутизатор базы данных с помощью метода allow_migrate, возвращающего False
для ваших динамических моделей. Команда migrate
запретит их в этом случае.
Пока вы не загружаете эти динамические модели в любой модуль models.py
, makemigrations
также не должен их подбирать.