Еще один вопрос о недостающих файлах миграции

Мне досталось в наследство приложение Django без файлов миграции. Я предполагаю, что приложение было разработано на более старой версии Django, чем та, что находится на сервере.

Первое выполнение python manage.py makemigrations проходит успешно и создает 0001_initial.py файл

Миграция (python manage.py migrate) или новые выполнения makemigrations с существующим 0001_initial.py проваливаются со странной ошибкой:

 File "/afat/afatprivate/AFATdashboard/migrations/0001_initial.py", line 223, in Migration
bases=(models.Model, AFATdashboard.models.__support),
AttributeError: module 'AFATdashboard.models' has no attribute '_Migration__support'

Я искал _Migration__support и не нашел ничего полезного.

Ошибка возникает и при пустой базе данных, так что этот связанный ответ не решил проблему

Код из 0001_initial.py, последняя строка - 223

 migrations.CreateModel(
        name='EconCostoCorpiIdrici3',
        fields=[
            ('waterbodycode', models.CharField(blank=True, db_column='waterBodyCode', max_length=255, null=True)),
            ('waterbodyname', models.CharField(blank=True, db_column='waterBodyName', max_length=255, null=True)),
            ('numinterventi', models.BigIntegerField(blank=True, db_column='numInterventi', null=True)),
            ('numinterventiconcosto', models.BigIntegerField(blank=True, db_column='numInterventiConCosto', null=True)),
            ('costocorpoidrico2227', models.DecimalField(blank=True, db_column='costoCorpoIdrico2227', decimal_places=65535, max_digits=65535, null=True)),
            ('coperturafinanziariacorpoidrico', models.DecimalField(blank=True, db_column='coperturaFinanziariaCorpoIdrico', decimal_places=65535, max_digits=65535, null=True)),
            ('percentualecoperturafinanziaria', models.DecimalField(blank=True, db_column='percentualeCoperturaFinanziaria', decimal_places=65535, max_digits=65535, null=True)),
            ('waterbodycostconfidence', models.DecimalField(blank=True, db_column='waterBodyCostConfidence', decimal_places=65535, max_digits=65535, null=True)),
            ('costocorpoidrico2227color', models.TextField(blank=True, db_column='costoCorpoIdrico2227Color', null=True)),
            ('recid', models.TextField(db_column='recId', primary_key=True, serialize=False)),
        ],
        options={
            'db_table': 'ECON_costo_corpi_idrici_3',
            'managed': False,
        },
        bases=(models.Model, AFATdashboard.models.__support),
    ),

Что я могу сделать?

Читая файл миграции, кажется, что модель, которую вы используете EconCostoCorpiIdrici3, имеет managed=False, что означает, что django не будет создавать таблицы db для нее, но создаст файлы миграции. Вы можете прочитать больше об опции managed в документации

Полагаю, вы можете удалить managed=False и заново создать миграции

Наконец-то я нашел обходной путь. В начале models.py есть следующее объявление класса:

class __support:

Он начинается с двойного подчеркивания, которое, как оказалось, имеет особое значение в Django. Множество классов наследуется от __support и внутри файла миграции 0001_initial.py первым из них является тот, о котором сообщалось выше, EconCostoCorpiIdrici3

bases=(models.Model, AFATdashboard.models.__support),

Я заменил __support на _mySuperclass и команда миграции прошла успешно.

Это была банальная ошибка, которая стоила много времени, потому что не было никакой зацепки для ее истинной причины.

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