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