Индекс, определенный для абстрактного класса, неправильно включен в миграцию для конкретного дочернего элемента конкретного дочернего элемента - PullRequest
0 голосов
/ 17 марта 2020

Чтобы проиллюстрировать проблему, с которой я столкнулся, я буду использовать следующий пример. Допустим, в моем приложении есть следующая иерархия моделей:

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 вопроса:

  1. Является ли это ожидаемым поведением, и если да, то почему?

  2. Как мне лучше решить его. Является ли добавление индекса в его собственную миграцию и подделка его приемлемым путем?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...