Как вернуть первичный ключ модели базы данных Django PostgreSQL в AutoField, сохранив при этом внешний ключ и отношения "многие ко многим" - PullRequest
2 голосов
/ 10 апреля 2019

В настоящее время у меня есть производственное веб-приложение на основе 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 из моего файла models.py и выполнить миграцию - изначально он выдал ошибкусвязан с пустыми полями и значениями по умолчанию, поэтому я установил фиктивное значение по умолчанию в окне терминала и удалил его в файле миграции.

База данных успешно удалила поле идентификатора и сгенерировала новое поле первичного ключа Autonumber, однако ни одно изОтношения многие ко многим или по ключевым словам сохранялись после миграции.С тех пор я откатился к предыдущей версии базы данных.

1 Ответ

2 голосов
/ 11 апреля 2019

Как правило, это будет ваш подход.Шаги 1-4 можно объединить в одно развертывание.Шаги 5-7 в другой.Тогда 8-9 будет последним.

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