Подтвердить что ты не робот

Вы пытаетесь добавить не-nullable поле 'new_field' в userprofile без дефолта

Я знаю, что из 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)

Что такое параметры?

4b9b3361

Ответ 1

Вам необходимо указать значение по умолчанию:

new_field = models.CharField(max_length=140, default='SOME STRING')

Ответ 2

Если вы находитесь на ранней стадии разработки и вам не нужны текущие данные базы данных, вы можете просто удалить их и затем выполнить миграцию. Но сначала вам нужно очистить каталог миграций и удалить его строки из таблицы (django_migrations)

rm  your_app/migrations/*

rm db.sqlite3
python manage.py makemigrations
python manage.py migrate

Ответ 3

Один из вариантов - объявить значение по умолчанию для '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)

Ответ 4

Если "веб-сайт" может быть пустым, чем 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)

Ответ 5

Если вы на раннем этапе разработки цикла, вы можете попробовать это -

Удалите/прокомментируйте эту модель и все ее применения. Применить миграции. Это удалит эту модель, а затем снова добавит модель, запустит миграцию и у вас будет чистая модель с добавленным новым полем.

Ответ 6

В new_file добавить значение boolean null.

new_field = models.CharField(max_length=140, null=True)

после запуска ./manage.py syncdb для обновления базы данных. и, наконец, вы запустите ./manage.py makemigrations и ./manage.py migrate

Ответ 7

У вас уже есть записи базы данных в таблице UserProfile? Если это так, когда вы добавляете новые столбцы, БД не знает, что установить, потому что это не может быть NULL. Поэтому он спрашивает вас, что вы хотите установить для этих полей в столбце new_fields to. Мне пришлось удалить все строки из этой таблицы, чтобы решить проблему.

(Я знаю, что это было дано некоторое время назад, но я просто столкнулся с этой проблемой, и это было мое решение. Надеюсь, это поможет любому новому, кто это видит)

Ответ 9

Я, честно говоря, нашел лучший способ обойти это, просто создать другую модель со всеми полями, которые вам требуются, и назвать их немного по-другому. Запустите миграции. Удалите неиспользуемую модель и повторите миграцию. Вуаля.

Ответ 10

На самом деле Джанго говорит:

Таблица 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

Повеселись!

Ответ 11

Если SSH дает 2 варианта, выберите номер 1 и поставьте "Нет". Только это... на данный момент.