Мне нужно изменить тип поля в одной из моих моделей Django от CharField
до ForeignKey
. Поля уже заполнены данными, поэтому мне было интересно, что это лучший или правильный способ сделать это. Могу ли я просто обновить тип поля и выполнить миграцию, или есть ли какие-либо возможные «ошибки», о которых нужно знать? N.B: Я просто использую операции управления vanilla Django (makemigrations
и migrate
), а не на юг.Изменить тип поля модели Django от CharField до ForeignKey
ответ
Это, скорее всего, случай, когда вы хотите выполнить многоэтапную миграцию. Моя рекомендация для этого будет выглядеть примерно так:
Во-первых, давайте предположим, что это ваша первая модель, в приложение под названием discography
:
from django.db import models
class Album(models.Model):
name = models.CharField(max_length=255)
artist = models.CharField(max_length=255)
Теперь вы понимаете, что вы хотите использовать ForeignKey для художника вместо. Ну, как уже упоминалось, это не просто процесс для этого. Это нужно сделать в несколько этапов.
Шаг 1, добавить новое поле для ForeignKey, убедившись в том, чтобы пометить его как нуль:
from django.db import models
class Album(models.Model):
name = models.CharField(max_length=255)
artist = models.CharField(max_length=255)
artist_link = models.ForeignKey('Artist', null=True)
class Artist(models.Model):
name = models.CharField(max_length=255)
... и создать миграции для этого изменения.
./manage.py makemigrations discography
Шаг 2, заполните новое поле. Для этого вам нужно создать пустую миграцию.
./manage.py makemigrations --empty --name transfer_artists discography
После этой пустой миграции, вы хотите добавить одну RunPython
операции к нему для того, чтобы связать свои записи. В этом случае, это может выглядеть примерно так:
def link_artists(apps, schema_editor):
Album = apps.get_model('discography', 'Album')
Artist = apps.get_model('discography', 'Artist')
for album in Album.objects.all():
artist, created = Artist.objects.get_or_create(name=album.artist)
album.artist_link = artist
album.save()
Теперь, когда данные передаются в новое поле, вы могли бы на самом деле быть сделано, и оставить все как есть, используя новое поле для всего. Или, если вы хотите немного очистить, вы хотите создать еще две миграции.
Для первой миграции вы хотите удалить исходное поле, artist
. Для вашей второй миграции переименуйте новое поле artist_link
в artist
.
Это сделано в несколько шагов, чтобы гарантировать, что Django правильно распознает операции. Вы можете создать миграцию вручную, чтобы справиться с этим, но я оставлю это вам, чтобы понять.
Благодарим вас за ваш быстрый и всесторонний ответ. Это также стимулировало меня, наконец, сесть и правильно изучить миграцию Django! – ChrisM
Не должно быть './manage.py makemigrations -empty ...', хотя? Шаг 2 имеет «makemigration» (единственное). – ChrisM
А, да, спасибо за ловушку опечатки! –
- 1. Изменение поля моего имени от CharField до ForeignKey
- 2. Django Введите внешний ключ от модели CharField
- 3. ForeignKey vs CharField
- 4. Django изменить поле базы данных от integer до CharField
- 5. Django модели ForeignKey 2
- 6. Модель Django дублируется от модели foreignkey
- 7. Django: Используйте select_related без поля ForeignKey
- 8. Как заменить CharField на ForeignKey, используя юг в django?
- 9. Джанго: Как создать форму с ForeignKey поля (вход в CharField)
- 10. Наследование модели Django - могу ли я изменить тип модели?
- 11. Django Migrate - изменить charfield на datetimefield
- 12. Django ForeignKey виджет поля формы
- 13. Поле модели Django - populate_from Опция для CharField
- 14. Django .values_list() альтернатива, которая возвращает QuerySet для модели поля ForeignKey?
- 15. создания модели Django совместно уникальные поля
- 16. Нет поля, кроме CharField, работающего в django
- 17. Django migrations - изменить модель от Int до CharField и предварительно заполнить выбор опцией
- 18. Python Django - ForeignKey Class Choice для поля модели
- 19. ForeignKey поля, связанные с абстрактной модели в Django
- 20. Добавить два ForeignKey поля из одной модели в Django
- 21. Django admin inline изменение поля выбора для charfield динамически
- 22. Django - получить объект на основе поля ForeignKey
- 23. Получите Python тип поля модели Django?
- 24. Запрос Django по значению поля ForeignKey
- 25. Добавление ненулевого поля ForeignKey в Django
- 26. модели Django - как фильтровать количество ForeignKey объектов
- 27. Попытка изменить тип поля таблицы MYSQL От BLOB до JSON
- 28. Поля модели Django
- 29. Проверка Charfield в django
- 30. Фильтр ForeignKey id Из Django Модели
Следите за повторяющимися значениями, если у вас нет уникального ограничения на CharField? Это действительно зависит от того, дублировали ли вы данные раньше или просто хотите переместить его в свою таблицу. Если последнее, лучшее, что нужно делать, действительно зависит от того, что ваши данные ЗНАЧ. Django не может вызывать какое-либо магическое преобразование между CharField и ForeignKey. Вам нужно будет написать разумную миграцию самостоятельно. – user234461
Я думаю, что это похоже на то, что вы ищете. http://stackoverflow.com/questions/5373906/changing-the-django-data-type-in-models-without-droping-the-table – Vibhu