Невозможно изменить таблицы после миграции Django в БД posgres

Мне действительно нужно знать, почему мы не можем изменить типы столбцов после миграции в Postgres DB.

Я уже создал свои модели по команде python manage.py makemigrations then do migrate. Все выглядит хорошо и таблицы создаются в БД postgres.

class test_API(models.Model):
    IDnumber = models.IntegerField(null=False, blank=False)
    State = models.CharField(max_length = 256, null = True)
    Exlcludmethod = models.CharField(max_length=256, null=True)

class test_API_2(models.Model):
    Idnumber = models.Foreignkey(test_API, max_length = 256, blank=False, null = False)
    value = models.CharField(max_length=128, default="")
    last_updated = models.DateTimeField(auto_now=True)

Допустим, мы хотим изменить столбец IDnumber с Integerfield на Charfield.

class test_API(models.Model):
        IDnumber = models.CharField(null=False, blank=False)
        State = models.CharField(max_length = 256, null = True)
        Exlcludmethod = models.CharField(max_length=256, null=True)

и запустите python manage.py makemigrations снова

return self.cursor.execute(sql) psycopg2.errors.DuplicateTable: отношение "test_API" уже существует

.

Как мы можем изменять/изменять типы столбцов и выполнять миграции. Каков правильный способ сделать это?

Использование Django:Django==4.0.3 Python = 3.9.1 Posgresql = 2.9.3

Миграции Django с использованием RunPython для фиксации изменений

django 1.7 migrate получает ошибку "таблица уже существует"

Похоже, что вы хотите отбросить связь с test_API в test_API_2. Если вы хотите иметь возможность хранить строки типа 'abcd' и не пытаться сохранить что-либо из отношения, ранее созданного полем ForeignKey, то я считаю, что вам нужно сделать это в два этапа.

Первым шагом будет удаление (или комментирование) поля IDNnumber, выполнение миграций, затем добавление его обратно с новым типом поля.

Поле IDNumber было не просто целочисленным полем, оно имеет индексированное отношение к test_API, поэтому вам нужно сначала разорвать его, удалив поле, а затем создать новое поле с идентичным именем

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