Подтвердить что ты не робот

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, миграция должна быть обновлена ​​снова, удалив модель, которой она не должна заботиться.

Эти динамические модели не используются в приложении конкретно. Нет, где в коде я ссылаюсь на модель книг (из приведенного выше примера). Они генерируются во время выполнения и используются для чтения информации из устаревших таблиц, к которым они предоставляют доступ.

4b9b3361

Ответ 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 также не должен их подбирать.