Я начал изучать Django с курса YouTube.
В файле models.py есть два класса.
class Album(models.Model):
artist = models.CharField(max_length = 250)
album_title = models.CharField(max_length = 250)
album_logo = models.CharField(max_length = 1000)
def __str__(self):
return self.album_title + ' - ' + self.artist
class Song(models.Model):
album = models.ForeignKey(Album, on_delete=models.CASCADE)
file_type = models.CharField(max_length=10)
song_title = models.CharField(max_length=250)
genre = models.CharField(max_length=250)
def __str__(self):
return self.song_title
Я добавил жанр в Песня после миграция. Вот почему у меня проблема при добавлении данных. В интерактивной оболочке, если я пытаюсь сохранить (), он показывает, что нет поля «жанр». Если я снова попытаюсь выполнить миграцию, появится что-то вроде этого:
You are trying to add a non-nullable field 'genre' to song without a default; we can't do that (the database needs something to populate existing rows). Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit, and let me add a default in models.py Select an option:
Как правильно добавлять или удалять поля?





добавить default = "" в поле генерации
class Song(models.Model):
album = models.ForeignKey(Album, on_delete=models.CASCADE)
file_type = models.CharField(max_length=10)
song_title = models.CharField(max_length=250)
genre = models.CharField(max_length=250, default = "")
def __str__(self):
return self.song_title
Как показано в сообщении об ошибке, вы добавляете поле genre в модель Song без добавления к нему параметров default = "" или null=True. Когда вы переносите его, django не знает, как работать со старыми данными, которые были вставлены в базу данных без поля genere. Поэтому вы должны установить для них значение NULL с помощью null=True или другое значение по умолчанию с помощью default = "".
Вы также можете просто сохранить свой код. Но когда вы используете команду migrate, вы должны сообщить django, что вы дадите значение по умолчанию, такое как рекомендованное django:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
нажмите кнопку 1 и enter. введите "", а затем django установит все старые данные genre = "".
Чтобы расширить это, ваша первоочередная задача - успешно выполнить миграцию, чтобы иметь работающее приложение. Затем вы можете отредактировать каждую запись и ввести соответствующее значение genre.
Я сделал, как ты сказал. Теперь отображается: жанр добавлен к песне. Но проблема все еще есть. Если я добавлю некоторые данные в интерактивную оболочку и сохраню их, отобразится django.db.utils.OperationalError: в таблице music_song нет столбца с именем жанр
Как показано в сообщении об ошибке, в таблице music_song нет столбца с именем genre. Вы запускали команду python manage.py migrate?
Да. И после этого появился такой текст: в Песню добавлено поле жанр.
Если он показывает, что поле жанра было добавлено в таблицу песни, можно создать некоторые данные. Мне нужна дополнительная информация, чтобы найти ошибку.
Задача решена! Я снова мигрировал, и теперь он отлично работает по какой-то странной причине. Спасибо за все!
Наконец-то я его получил. Пришлось поставить две команды: python manage.py makemigrations music и python manage.py migrate. Я забыл об этом. Теперь все нормально.
просто выберите 1. и введите значение по умолчанию для существующих записей.