Еще один вопрос о недостающих файлах миграции
Мне досталось в наследство приложение 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 и команда миграции прошла успешно.
Это была банальная ошибка, которая стоила много времени, потому что не было никакой зацепки для ее истинной причины.