Чтобы проиллюстрировать проблему, с которой я столкнулся, я буду использовать следующий пример. Допустим, в моем приложении есть следующая иерархия моделей:
class Key(models.Model):
pass
class AbstractThing(models.model):
key = models.ForeignKey(Key)
class Meta:
abstract = True
indexes = [
models.Index(fields=['key'])
]
class Thing(AbstractThing):
pass
class ChildOfThing(Thing):
pass
Теперь, поскольку я определил индекс для абстрактной модели AbstractThing
, я бы ожидал, что таблица всех унаследованных моделей будет иметь * Индекс 1005 *, но не в том случае, если я наследую дальше от одного из них, так как они не будут содержать столбец. Однако, когда я создаю миграции, я вижу, что в несуществующий столбец ChildOfThing.key
добавлен индекс, который, конечно, не существует. Поскольку Thing
является конкретным классом, в нем содержится столбец key
.
Файл миграции создается следующим образом:
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Key',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=200)),
],
),
migrations.CreateModel(
name='Thing',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='ChildOfThing',
fields=[
('thing_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='things.Thing')),
],
options={
'abstract': False,
},
bases=('things.thing',),
),
migrations.AddField(
model_name='thing',
name='key',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='things.Key'),
),
migrations.AddIndex(
model_name='thing',
index=models.Index(fields=['key'], name='things_thin_key_id_acfd46_idx'),
),
migrations.AddIndex(
model_name='childofthing',
index=models.Index(fields=['key'], name='things_chil_key_id_e40989_idx'),
),
]
Теперь, когда я пытаюсь запустить миграцию, я получите ошибку django.db.utils.ProgrammingError: column "key_id" does not exist
, что имеет смысл. Я могу вручную удалить индекс на ChildOfThing
в процессе миграции и успешно запустить его, но после этого каждый автоматический перенос добавит его обратно. У меня есть 2 вопроса:
Является ли это ожидаемым поведением, и если да, то почему?
Как мне лучше решить его. Является ли добавление индекса в его собственную миграцию и подделка его приемлемым путем?