您正尝试在不缺省的情况下向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,希望它会帮助任何新的看到这个)
如果你早期进入开发周期,你可以试试这个 –
删除/评论该模型及其所有用法。 应用迁移。 这将删除该模型,然后再次添加模型,运行迁移,你有一个干净的模型,添加新的字段。