Столбец 'tbl1.id' не имеет того же типа данных, что и ссылающийся столбец 'tbl2.field_id' во внешнем ключе 'tb1_field_id_tbl2_id'
У меня возникла проблема с миграцией. Я использую базу данных, которая была создана с старой Django версии 1.4 в новом приложении с Django версии >5. Проблема заключается в том, что старый Django использует другой тип данных для поля первичного ключа (AutoField - int в базе данных). Так в базе данных тип данных старого первичного ключа Django - «int», а в новом Django тип данных - «bigint». Я создал новую модель с внешним ключом к старой модели и теперь сталкиваюсь с ошибкой:
Колонка 'tbl1.id' не имеет того же типа данных, что и ссылающаяся колонка 'tbl2.field_id' во внешнем ключе 'tb1_field_id_tbl2_id'
Как я могу решить эту проблему?
Единственное, что помогает - это присвоить db_constraint=True в поле models.ForeignKey. Но я не хочу рисковать
То, что я уже пробовал:
- Измените DEFAULT_AUTO_FIELD на django.db.models.AutoField .
- Явно установите id таблицы внешнего ключа в AutoField. Слишком много зависимостей от этой таблицы, поэтому она падает при других отношениях.
- Явное сопоставление с определенным полем
to_field="id"
- Установите
db_constraint=False
- это помогает, но не является лучшим решением. - Сделал новую миграцию для новой модели с AutoField. Похоже, что Django все еще ссылается на
bigint
для таблицы с внешним ключом .
Либо перенести старые модели в bigint
или
Установите DEFAULT_AUTO_FIELD
на
DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
Following все еще используется по умолчанию для старых проектов, но для новых проектов он установлен на BigAutoField
, так как документирован
Начиная с версии 3.2 новые проекты генерируются с DEFAULT_AUTO_FIELD установленным на BigAutoField.
Я исправил это, объединив все советы. Спасибо @iklinac
- Сначала я установил
DEFAULT_AUTO_FIELD = “django.db.models.AutoField”
. - Затем в каждом приложении в файле apps.py в классах приложений я изменил поле default_auto_field с
default_auto_field = “django.db.models.BigAutoField”
наdefault_auto_field = “django.db.models.AutoField”
. - Затем удалите все файлы миграции .
- Сначала применили миграции без новой модели
- Затем применили миграции с новой моделью. Теперь ошибки нет и все работает.