Django переименование поля и создание нового с тем же именем возвращает ошибку psycopg2: DuplicateTable: отношение уже существует

У меня есть поле Django (внешний ключ), которое я переименовал в одной миграции (автоматическое определение). Затем я понял, что мне действительно нужно поле с таким же именем, но другим. Локально я разрабатываю на SQLite DB и это работает нормально. Когда я переместил его в нашу БД Postgres, это привело к ошибке

Миграция один

operations = [
        migrations.RenameField(
            model_name='modelname',
            old_name='oldfieldname',
            new_name='newfieldname',
        ),]

Миграция два

operations = [
        migrations.AddField(
            model_name='modelname',
            name='oldfieldname',
            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='OldFieldName', to='app.othermodel'),
        ),]

Когда я запускаю эту миграцию, я получаю следующую ошибку

  Applying app.xxx1_previous... OK
  Applying delight.xxx2_rename_field... OK
  Applying delight.xxx3_add_field...Traceback (most recent call last):
  File "/app/.heroku/python/lib/python3.10/site-packages/django/db/backends/utils.py", line 85, in _execute
    return self.cursor.execute(sql, params)
psycopg2.errors.DuplicateTable: relation "app_modelname_oldfieldname_id_8c448c6a" already exists

Обычно это должно было быть удалено. Я нашел this issue, описывающий похожую проблему в Postgress, и теперь я задаюсь вопросом, не является ли это ошибкой в Django. Может быть, очистка после переименования выполняется неправильно?

После долгих поисков в кроличьей норе SQL, я обнаружил, что миграция переименования для PostgresQL не удаляет старый индекс.

Когда я хотел создать новое поле, он пытался создать новый индекс с тем же именем, что и старый индекс (который не был удален). На данный момент я вручную удалил этот индекс после миграции. Я дополню этот ответ, когда найду способ включить это в миграцию.

Я также сообщил об этой проблеме на баг-трекере Django. https://code.djangoproject.com/ticket/33488

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