Django: как добавить / удалить поля в базе данных sqlite3?

Я начал изучать 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:

Как правильно добавлять или удалять поля?

просто выберите 1. и введите значение по умолчанию для существующих записей.

Brown Bear 30.05.2018 13:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
1 156
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

добавить 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.

Demetris 30.05.2018 14:06

Я сделал, как ты сказал. Теперь отображается: жанр добавлен к песне. Но проблема все еще есть. Если я добавлю некоторые данные в интерактивную оболочку и сохраню их, отобразится django.db.utils.OperationalError: в таблице music_song нет столбца с именем жанр

Ramisa Anjum Aditi 30.05.2018 18:46

Как показано в сообщении об ошибке, в таблице music_song нет столбца с именем genre. Вы запускали команду python manage.py migrate?

ramwin 31.05.2018 05:34

Да. И после этого появился такой текст: в Песню добавлено поле жанр.

Ramisa Anjum Aditi 31.05.2018 12:19

Если он показывает, что поле жанра было добавлено в таблицу песни, можно создать некоторые данные. Мне нужна дополнительная информация, чтобы найти ошибку.

ramwin 31.05.2018 14:00

Задача решена! Я снова мигрировал, и теперь он отлично работает по какой-то странной причине. Спасибо за все!

Ramisa Anjum Aditi 01.06.2018 14:04

Наконец-то я его получил. Пришлось поставить две команды: python manage.py makemigrations music и python manage.py migrate. Я забыл об этом. Теперь все нормально.

Ramisa Anjum Aditi 01.06.2018 21:27

Другие вопросы по теме