Столбец '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

  1. Сначала я установил DEFAULT_AUTO_FIELD = “django.db.models.AutoField”.
  2. Затем в каждом приложении в файле apps.py в классах приложений я изменил поле default_auto_field с default_auto_field = “django.db.models.BigAutoField” на default_auto_field = “django.db.models.AutoField”.
  3. Затем удалите все файлы миграции
  4. .
  5. Сначала применили миграции без новой модели
  6. Затем применили миграции с новой моделью. Теперь ошибки нет и все работает.
Вернуться на верх