#django #postgresql #django-models
#django #postgresql #django-models
Вопрос:
В настоящее время у меня есть веб-приложение на базе Django, которое содержит несколько моделей, размещенных поверх базы данных Postgresql (Google Cloud SQL)
Во время первоначальной настройки одна из моделей была настроена следующим образом:
class ExampleModel(models.Model):
id = models.CharField(max_length=60, unique=True, primary_key=True)
new_id = models.CharField(max_length=60, unique=True, null=True, db_index=True)
name = models.CharField(max_length=300, db_index=True)
tags = models.ManyToManyField(Tag, blank=True)
Поле id содержит уникальный идентификатор, например: AB123456789.
С тех пор я понял, что это ошибка, и хотел бы вернуть поле первичного ключа в стандартное автоматически увеличивающееся автоматическое поле, а вместо этого использовать поле ‘new_id’ для хранения уникального идентификатора.
Пожалуйста, может кто-нибудь дать рекомендации о том, как я могу внести это изменение и выполнить необходимые миграции базы данных? В других моделях существует ряд полей внешнего ключа, которые в настоящее время используют поле id в приведенной выше модели, которое потребуется изменить. Как вы можете видеть из приведенного выше, между этой моделью и моделью тегов также существует поле «многие ко многим».
Я попытался удалить поле id из моего models.py файл и миграция — изначально он выдавал ошибку, связанную с нулевыми полями и значениями по умолчанию, поэтому я установил фиктивное значение по умолчанию в окне терминала и удалил его в файле миграции.
База данных успешно удалила поле id и сгенерировала новое поле первичного ключа Autonumber, однако ни одно из отношений «многие ко многим» или «внешний ключ» не было сохранено после миграции. С тех пор я вернулся к предыдущей версии базы данных.
Ответ №1:
Как правило, это будет ваш подход. Шаги 1-4 могут быть объединены в одно развертывание. Шаги 5-7 в другой. Тогда 8-9 будет окончательным.
- Создайте новое автоматическое поле.
- Создайте новые отношения FK с нулевым значением для моделей
- Обновите весь код, который создает связанные модели для заполнения обоих FK
- Заполните все нулевые поля FK с помощью скрипта
- Сделайте новые поля FK не-nullable
- Сделайте старый FK обнуляемым.
- Удалите старые обычаи FK из базы кода
- Миграция для удаления старого поля идентификатора и FKS.
- (необязательно) Переименуйте автоматическое поле в ID и, возможно, используйте встроенное поле Django.