Я знаю, что из Django 1.7 мне не нужно использовать Юг или любую другую систему миграции, поэтому я просто использую простую команду python manage.py makemigrations
Однако все, что я получаю, это ошибка:
You are trying to add a non-nullable field 'new_field' to userprofile without a default;
we can't do that (the database needs something to populate existing rows).
Вот models.py:
class UserProfile(models.Model):
user = models.OneToOneField(User)
website = models.URLField(blank=True)
new_field = models.CharField(max_length=140)
Какие есть варианты?
Ответы:
Вам необходимо указать значение по умолчанию:
источник
default = website
не выполняет свою работуnew_field
значениеwebsite
.Если вы находитесь на раннем этапе разработки и вас не волнуют текущие данные базы данных, вы можете просто удалить их, а затем перенести. Но сначала вам нужно очистить каталог миграций и удалить его строки из таблицы (django_migrations)
источник
mysql -u[user] [database] -e "delete from django_migrations where app=[your_app]"
__init__.py
удалили файл из миграций или не восстановили его впоследствии, иначе makemigrations не будет работать stackoverflow.com/a/46362750/1649917python manage.py sqlmigrate name_of_your_app nb_of_the_migration
также требуетсяОдин из вариантов - объявить значение по умолчанию для new_field:
другой вариант - объявить new_field как поле, допускающее значение NULL:
Если вы решите принять «new_field» как поле, допускающее значение NULL, вы можете принять «no input» как допустимый ввод для «new_field». Затем вам нужно также добавить
blank=True
оператор:Даже с
null=True
и / или при необходимостиblank=True
вы можете добавить значение по умолчанию:источник
Если вы находитесь на ранней стадии разработки, вы можете попробовать это -
Удалите / прокомментируйте эту модель и все ее использования. Примените миграции. Это удалит эту модель, а затем снова добавит ее, запустит миграции, и у вас будет чистая модель с добавленным новым полем.
источник
В случае, если кто-то устанавливает a
ForeignKey
, вы можете просто разрешить поля, допускающие значение NULL, без установки значения по умолчанию:Если у вас уже есть данные, хранящиеся в базе данных, вы также можете установить значение по умолчанию:
источник
Если «веб-сайт» может быть пустым, он
new_field
также должен быть пустым.Теперь, если вы хотите добавить логику для сохранения, где если
new_field
пусто, чтобы получить значение с «веб-сайта», все, что вам нужно сделать, это переопределить функцию сохранения для вас,Model
например:источник
Вы не можете добавить ссылку на таблицу, в которой уже есть данные.
Изменить:
кому:
делать:
снова изменить:
выполните миграцию еще раз:
источник
В new_file добавьте логическое свойство null.
после запуска
./manage.py syncdb
для обновления БД. и наконец ты бежишь./manage.py makemigrations
и./manage.py migrate
источник
Вы можете использовать метод из Django Doc с этой страницы https://docs.djangoproject.com/en/1.8/ref/models/fields/#default
Создать по умолчанию и использовать его
источник
У вас уже есть записи базы данных в таблице
UserProfile
? Если да, то когда вы добавляете новые столбцы, БД не знает, что это делать, потому что это невозможноNULL
. Поэтому он спрашивает, что вы хотите установить для этих полей в столбцеnew_fields
. Мне пришлось удалить все строки из этой таблицы, чтобы решить проблему.(Я знаю, что на это был дан ответ некоторое время назад, но я только что столкнулся с этой проблемой, и это было моим решением. Надеюсь, это поможет любому новому, кто это увидит)
источник
Честно говоря, я нашел, что лучший способ обойти это - просто создать другую модель со всеми необходимыми полями и немного другими именами. Запустите миграции. Удалите неиспользуемую модель и снова запустите миграции. Вуаля.
источник
Если вас устраивает усечение таблицы рассматриваемой модели, вы можете указать
None
в приглашении одноразовое значение по умолчанию . Миграция будет лишней,default=None
пока в вашем коде нет значения по умолчанию. Его можно применить просто так, потому что в таблице больше нет данных, которые требовали бы значения по умолчанию.источник
Я был на раннем этапе своего цикла разработки, поэтому это может не сработать для всех (но я не понимаю, почему это не так).
Я добавил
blank=True, null=True
в столбцы, где получал ошибку. Затем я выполнилpython manage.py makemigrations
команду.Сразу после выполнения этой команды (и перед запуском
python manage.py migrate
) я удалилblank=True, null=True
из всех столбцов. Затем я побежалpython manage.py makemigrations
снова . Мне дали возможность просто изменить столбцы самостоятельно, которые я выбрал.Потом побежал
python manage.py migrate
и все заработало!источник
На самом деле Django говорит:
Если вы уверены, что ни одно из значений в
userprofile
таблице не является NULL - выпали и игнорируйте предупреждение.Лучшей практикой в таких случаях было бы создание миграции RunPython для обработки пустых значений, как указано в варианте 2.
В миграции RunPython вы должны найти все
UserProfile
экземпляры с пустымnew_field
значением и поместить туда правильное значение (или значение по умолчанию, которое Django просит вас установить в модели). Вы получите что-то вроде этого:Радоваться, веселиться!
источник
В models.py
class UserProfile(models.Model): user = models.OneToOneField(User) website = models.URLField(blank=True) new_field = models.CharField(max_length=140, default="some_value")
Вам нужно добавить некоторые значения по умолчанию.
источник
Если SSH дает вам 2 варианта, выберите номер 1 и поставьте «Нет». Только это ... на данный момент.
источник