您正尝试在不缺省的情况下向userprofile添加一个不可为空的字段'new_field'

我知道从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) 

什么是选项?

您需要提供一个默认值:

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

如果您处于早期开发周期,并且不关心您当前的数据库数据 ,则可以将其删除并迁移。 但首先你需要清理迁移目录

 rm your_app/migrations/* rm db.sqlite3 python manage.py makemigrations python manage.py migrate 

一种select是声明“new_field”的默认值:

 new_field = models.CharField(max_length=140, default='DEFAULT VALUE') 

另一种select是将“new_field”声明为可为空的字段:

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

如果您决定接受'new_field'作为可空字段,您可能需要接受'no input'作为'new_field'的有效input。 那么你还必须添加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空,也应该设置为空。

现在,如果你想添加逻辑保存,如果new_field为空以从“网站”获取值, new_field需要覆盖Model的保存function,如下所示:

 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中添加boolean属性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

创build默认并使用它

 def contact_default(): return {"email": "to1@example.com"} contact_info = JSONField("ContactInfo", default=contact_default) 

UserProfile表中已经有数据库条目了吗? 如果是这样,当添加新列时,数据库不知道要设置为什么,因为它不能为NULL 。 因此,它询问你想要在new_fields列中设置这些字段。 我不得不从这个表中删除所有的行来解决这个问题。

(我知道这是前段时间的答案,但我遇到了这个问题,这是我的解决scheme,希望它会帮助任何新的看到这个)

如果你早期进入开发周期,你可以试试这个 –

删除/评论该模型及其所有用法。 应用迁移。 这将删除该模型,然后再次添加模型,运行迁移,你有一个干净的模型,添加新的字段。