У меня есть существующая модель, которая выглядит примерно следующим образом ...
class Resource(models.Model):
id = models.AutoField(primary_key=True)
Мы использовали это в течение некоторого времени, и теперь у нас есть ~ 1M экземпляров этих Resource
объектов (и связанных с нимиForeignKey / else usages) в нашей базе данных.
Теперь мне нужно отследить еще один идентификатор для этой модели, который я хочу использовать уникальным.
other_id = models.IntegerField(unique=True)
This other_id
информация в настоящее время хранится в некоторых внешних CSV-файлах, и я хочу (в какой-то момент процесса) загрузить эту информацию во все существующие Resource
экземпляры.
После добавления указанного поля Django makemigrations
работаетпросто хорошо.Однако, когда я применяю указанную миграцию к существующей базе данных, я получаю сообщение об ошибке, указывающее, что мне нужно указать значение по умолчанию для использования со всеми существующими экземплярами Resource
.Я уверен, что многие из вас видели нечто подобное.
Как лучше всего обойти это ограничение?Некоторые методы, о которых я думал ...
- Удалите требование
unique=True
- , примените миграцию
- для внешней загрузки в *Значение 1028 * для всех существующих моделей (с помощью некоторой команды управления или сценария отключения)
- добавьте обратно
unique=True
и примените миграцию
- Сбросить все существующие данные в JSON
- очистить все таблицы
- применить миграцию (с уникальным = True)
- написать скрипт, который загружает данные обратно,добавление правильного
other_id
значения
- (не уверен, если это возможно) - Напишите некоторую настраиваемую логику миграции, чтобы автоматически ссылаться на эти внешние CSV-файлы для загрузки значений
other_id
при запуске manage.py migrate
,Это может вызвать проблемы, если (в какой-то момент в будущем) кто-то повторно запустит эти миграции, и эта часть не будет выполнена (не удается найти существующий ресурс id
в CSV для извлечения other_id
).
Все это кажется сложным, но опять же, я думаю, то, что я пытаюсь сделать, тоже не самое простое.
Есть идеи?Я должен представить, что кому-то приходилось обходить подобные проблемы в прошлом.
Спасибо!