Ответ 1
Вам необходимо указать значение по умолчанию:
new_field = models.CharField(max_length=140, default='SOME STRING')
Я знаю, что из 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).
Вот модели .py:
class UserProfile(models.Model):
user = models.OneToOneField(User)
website = models.URLField(blank=True)
new_field = models.CharField(max_length=140)
Что такое параметры?
Вам необходимо указать значение по умолчанию:
new_field = models.CharField(max_length=140, default='SOME STRING')
Если вы находитесь на ранней стадии разработки и вам не нужны текущие данные базы данных, вы можете просто удалить их и затем выполнить миграцию. Но сначала вам нужно очистить каталог миграций и удалить его строки из таблицы (django_migrations)
rm your_app/migrations/*
rm db.sqlite3
python manage.py makemigrations
python manage.py migrate
Один из вариантов - объявить значение по умолчанию для 'new_field':
new_field = models.CharField(max_length=140, default='DEFAULT VALUE')
другой вариант заключается в объявлении 'new_field' как поля с нулевым значением:
new_field = models.CharField(max_length=140, null=True)
Если вы решите принять 'new_field' в качестве поля с нулевым значением, вы можете принять 'no input' в качестве допустимого ввода для 'new_field'. Затем вам нужно добавить оператор blank=True
:
new_field = models.CharField(max_length=140, blank=True, null=True)
Даже при null=True
и/или blank=True
при необходимости вы можете добавить значение по умолчанию:
new_field = models.CharField(max_length=140, default='DEFAULT VALUE', blank=True, null=True)
Если "веб-сайт" может быть пустым, чем new_field
также должен быть пустым.
Теперь, если вы хотите добавить логику в save, где, если new_field
пусто, чтобы захватить значение с "веб-сайта", все, что вам нужно сделать, это переопределить функцию сохранения для вашего Model
следующим образом:
class UserProfile(models.Model):
user = models.OneToOneField(User)
website = models.URLField(blank=True, default='DEFAULT VALUE')
new_field = models.CharField(max_length=140, blank=True, default='DEFAULT VALUE')
def save(self, *args, **kwargs):
if not self.new_field:
# Setting the value of new_field with website value
self.new_field = self.website
# Saving the object with the default save() function
super(UserProfile, self).save(*args, **kwargs)
Если вы на раннем этапе разработки цикла, вы можете попробовать это -
Удалите/прокомментируйте эту модель и все ее применения. Применить миграции. Это удалит эту модель, а затем снова добавит модель, запустит миграцию и у вас будет чистая модель с добавленным новым полем.
В new_file добавить значение boolean null.
new_field = models.CharField(max_length=140, null=True)
после запуска ./manage.py syncdb
для обновления базы данных.
и, наконец, вы запустите ./manage.py makemigrations
и ./manage.py migrate
У вас уже есть записи базы данных в таблице UserProfile
? Если это так, когда вы добавляете новые столбцы, БД не знает, что установить, потому что это не может быть NULL
. Поэтому он спрашивает вас, что вы хотите установить для этих полей в столбце new_fields
to. Мне пришлось удалить все строки из этой таблицы, чтобы решить проблему.
(Я знаю, что это было дано некоторое время назад, но я просто столкнулся с этой проблемой, и это было мое решение. Надеюсь, это поможет любому новому, кто это видит)
Вы можете использовать метод из Django Doc с этой страницы https://docs.djangoproject.com/en/1.8/ref/models/fields/#default
Создать значение по умолчанию и использовать его
def contact_default():
return {"email": "[email protected]"}
contact_info = JSONField("ContactInfo", default=contact_default)
Я, честно говоря, нашел лучший способ обойти это, просто создать другую модель со всеми полями, которые вам требуются, и назвать их немного по-другому. Запустите миграции. Удалите неиспользуемую модель и повторите миграцию. Вуаля.
На самом деле Джанго говорит:
Таблица userprofile содержит данные, и могут быть значения
new_field
которые являются нулевыми, но я не знаю, так что вы уверены, что хотите пометить свойство как необнуляемое, потому что, если вы это сделаете, вы можете получить ошибку, если есть значения с NULL
Если вы уверены, что ни одно из значений в таблице userprofile
не равно NULL - выпало значение и игнорируйте предупреждение.
В таких случаях рекомендуется создать миграцию RunPython для обработки пустых значений, как указано в варианте 2.
2) Игнорируем пока, и позвольте мне самому обрабатывать существующие строки с помощью NULL (например, потому что вы добавили операцию RunPython или RunSQL для обработки значений NULL в предыдущей миграции данных)
В миграции RunPython вы должны найти все экземпляры UserProfile
с пустым значением new_field
и поместить туда правильное значение (или значение по умолчанию, как Django просит вас установить в модели). Вы получите что-то вроде этого:
# please keep in mind that new_value can be an empty string. You decide whether it is a correct value.
for profile in UserProfile.objects.filter(new_value__isnull=True).iterator():
profile.new_value = calculate_value(profile)
profile.save() # better to use batch save
Повеселись!
Если SSH дает 2 варианта, выберите номер 1 и поставьте "Нет". Только это... на данный момент.