Как вернуть первичный ключ модели базы данных Django PostgreSQL в автоматическое поле при сохранении внешнего ключа и отношений «многие ко многим»

#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 будет окончательным.

  1. Создайте новое автоматическое поле.
  2. Создайте новые отношения FK с нулевым значением для моделей
  3. Обновите весь код, который создает связанные модели для заполнения обоих FK
  4. Заполните все нулевые поля FK с помощью скрипта
  5. Сделайте новые поля FK не-nullable
  6. Сделайте старый FK обнуляемым.
  7. Удалите старые обычаи FK из базы кода
  8. Миграция для удаления старого поля идентификатора и FKS.
  9. (необязательно) Переименуйте автоматическое поле в ID и, возможно, используйте встроенное поле Django.