Вы пытаетесь добавить ненулевое поле "новое поле" в userprofile без значения по умолчанию



Я знаю, что из Django 1.7 мне не нужно использовать South или любую другую систему миграции, поэтому я просто использую простую команду 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)


какие варианты?

700   10  

10 ответов:

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

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

Если вы находитесь в раннем цикле развития и не важно о текущем базы данных вы можете просто удалить его, а затем перенести. Но сначала вам нужно очистить migrations dir и удалить его строки из таблицы (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' в поле nullable:

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 where if 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's value
            self.new_field = self.website

        # Saving the object with the default save() function
        super(UserProfile, self).save(*args, **kwargs)

в new_file добавить булево свойство имеет значение null.

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

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

вы можете использовать метод из 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? Если это так, то при добавлении новых столбцов БД не знает, что его установить, потому что это не может быть NULL. Поэтому он спрашивает вас, что вы хотите установить эти поля в столбце new_fields для. Я должен был удалить все строки из этой таблицы, чтобы решить проблему.

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

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

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

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

таблица Userprofile имеет данные в нем, и там может быть new_field значения которые равны нулю, но я не знаю, так что вы уверены, что хотите отметить свойство как не nullable, потому что если вы это сделаете, вы можете получить сообщение об ошибке, если есть значения с NULL

если вы уверены, что ни одно из значений userprofile таблицы имеют значение null - смело и не обращайте внимания на предупреждение.

лучшей практикой в таких случаях было бы создайте миграцию RunPython для обработки пустых значений, как указано в опции 2

2) игнорируйте сейчас, и позвольте мне обрабатывать существующие строки с NULL самостоятельно (например, потому что вы добавили операцию RunPython или RunSQL для обработки нулевых значений в предыдущей миграции данных)

в миграции 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

удачи!

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

Comments

    Ничего не найдено.