Почему Django создает файлы миграции для прокси-моделей?

Я только что создал прокси-модель и был удивлен, что manage.py makemigrations создает новый файл миграции с помощью операции migrations.CreateModel.

Прокси-модель не создает новую таблицу базы данных, это просто другой интерфейс Python для того же набора данных, и действительно manage.py sqlmigrate my_app_label 0042 ничего не возвращает.

Я думал, что его можно использовать для создания прокси-модели ContentType, но они создаются по запросу, если их не существует.

Используется ли он для запуска создания разрешений прокси-модели? Существует 6-летняя открытая ошибка в разрешениях модели прокси, поэтому я не совсем уверен, как эта часть теперь должно работать...

Он использовал Django 1.8, чтобы проверить это.

Изменить: чтобы уточнить, Django создает миграцию, которая ничего не делает для новых моделей прокси-серверов, поэтому разве мы не хотим, чтобы Django вообще не создавал миграцию, если она бесполезна?

Есть ли вариант использования, когда было бы полезно иметь миграцию?


person Maxime R.    schedule 23.06.2016    source источник


Ответы (2)


Ах, но если вы откроете миграцию в своем редакторе, вы обнаружите, что на самом деле это пустая миграция! Вот пример

class Migration(migrations.Migration):
    dependencies = [
        ('stackoverflow', '0009_auto_20160622_1507'),
    ]

    operations = [
        migrations.CreateModel(
            name='MyArticle',
            fields=[
            ],
            options={
                'proxy': True,
            },
            bases=('stackoverflow.article',),
        ),
    ]

И если вы запустите ./manage.py sqlmigrate myapp 0010 (это число, которое соответствует моей миграции выше), вы получите то, что находится на следующей строке (ничего).

Это связано с тем, что раздел fields миграции пуст, а option включает proxy = True. Этот параметр предотвращает выполнение любых SQL для этой миграции, а исходная таблица остается нетронутой.

Итак, вы можете спросить, почему Django создает пустую миграцию? Это связано с тем, что на прокси-модель может ссылаться другая модель при миграции в будущем.

person e4c5    schedule 23.06.2016

Я считаю, что migrations генерируются, потому что затронуты базы данных, а migrations — это то, как Django сигнализирует об изменениях базы данных. Структура не меняется, но добавляются записи (как минимум) в две таблицы:

  • Новый ContentType добавляется к django_content_type для прокси-модели.
  • Разрешения, специфичные для модели прокси, добавляются в auth_permission. Я предполагаю, что это происходит «всегда», если прокси-сервер не использует точно такое же имя класса. Это, безусловно, происходит — мы фактически используем прокси-модель для доступа к пользователю с использованием различных разрешений, не затрагивая модель пользователя по умолчанию.

Обе эти детали фактически отмечены в цепочке комментариев проблемы, связанной с OP (например, комментарий № 31), потому что они способствуют ошибке (то есть, что Django ищет разрешения в другом приложении, чем те, которые фактически сгенерированы в auth_permissions).

person claytond    schedule 01.05.2018