Обновление Django с несовместимыми миграциями

Передо мной стоит задача обновить версию Django для проекта, который в настоящее время использует Django 2.2.24. Он содержит модель (с существующими миграциями), которая выглядит примерно так:

class Membership(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    type = models.ForeignKey(MembershipType, on_delete=None)

Начиная с Django 3.0, on_delete=None вызывает ошибку, поскольку on_delete должен быть вызываемым объектом. Чтобы избежать ошибки, необходимо изменить как модель, так и существующие миграции.
Само по себе изменение модели следующим образом не представляет проблемы:

class Membership(models.Model):
     person = models.ForeignKey(Person, on_delete=models.CASCADE)
     type = models.ForeignKey(MembershipType, on_delete=models.SET_NULL, null=True)

Но существующие базы данных еще не знают, что соответствующее поле может быть nullable, поэтому для этого требуется новая миграция.
Лучший способ, который я вижу в настоящее время, чтобы сделать это, следующий:

  • изменить модель
  • >создайте&примените миграцию, используя Django 2.2.24
  • измените старые миграции вручную

Есть ли более элегантный способ решения этой проблемы?

Я не уверен, что это оптимальное решение, но, возможно, оно поможет вам найти хотя бы похожее решение.

Если вы можете сбросить базу данных, тогда вы можете найти файл миграции, где впервые было создано поле, и изменить on_delete на SET_NULL и установить null=True. Затем удалите базу данных и запустите миграции с нуля.

Если вы не можете удалить базу данных, тогда вы можете:

  1. Измените модель в соответствии с вашим кодом.
  2. Отредактируйте файл миграции, в котором было создано поле. (То же, что и выше).
  3. Вручную в базе данных выполните SQL для изменения поля, чтобы сделать его nullable.
Вернуться на верх