我知道从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)
有什么选择?
答案 0 :(得分:62)
如果您处于早期开发周期且不关心关于您当前的数据库数据,您只需删除它然后迁移即可。但首先你需要清理迁移目录并从表中删除它的行(django_migrations)
rm your_app/migrations/*
rm db.sqlite3
python manage.py makemigrations
python manage.py migrate
答案 1 :(得分:58)
您需要提供默认值:
new_field = models.CharField(max_length=140, default='SOME STRING')
答案 2 :(得分:28)
一种选择是声明' 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'作为一个可以为空的字段,您可能希望接受“无输入”#39;作为' 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)
答案 3 :(得分:7)
如果任何人都在设置ForeignKey
,则可以只允许设置可为空的字段而无需设置默认值:
new_field = models.ForeignKey(model, null=True)
如果您已经在数据库中存储了数据,则还可以设置默认值:
new_field = models.ForeignKey(model, default=<existing model id here>)
答案 4 :(得分:4)
如果“网站”可以为空,则new_field
也应设置为空。
现在,如果您想在保存时添加逻辑,如果new_field
为空以从“网站”获取值,您只需覆盖Model
的保存功能,如下所示:< / p>
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)
答案 5 :(得分:3)
如果您处于开发周期的早期阶段,可以试试这个 -
删除/评论该模型及其所有用法。应用迁移。那将删除该模型,然后再次添加模型,运行迁移,并且您有一个添加了新字段的干净模型。
答案 6 :(得分:2)
在new_file中添加布尔属性null。
new_field = models.CharField(max_length=140, null=True)
运行./manage.py syncdb
以刷新数据库后。
最后你运行./manage.py makemigrations
和./manage.py migrate
答案 7 :(得分:2)
表UserProfile
中是否已有数据库条目?如果是这样,当您添加新列时,数据库不知道将其设置为什么,因为它不能NULL
。因此,它会询问您要在new_fields
列中设置这些字段的内容。我不得不删除此表中的所有行来解决问题。
(我知道这已经回答了一段时间了,但我遇到了这个问题,这是我的解决方案。希望它会帮助那些看到这个的新人)
答案 8 :(得分:2)
您可以从此页https://docs.djangoproject.com/en/1.8/ref/models/fields/#default
使用Django Doc中的方法创建默认值并使用它
def contact_default():
return {"email": "to1@example.com"}
contact_info = JSONField("ContactInfo", default=contact_default)
答案 9 :(得分:1)
老实说,最好的解决方法是创建另一个模型,其中包含您需要的所有字段,并命名略有不同。运行迁移。删除未使用的模型并再次运行迁移。瞧。
答案 10 :(得分:1)
我还处于开发周期的早期,所以这可能不适用于每个人(但我不知道为什么不行)。
我在发生错误的列中添加了blank=True, null=True
。然后,我运行了python manage.py makemigrations
命令。
在运行此命令之后(以及在运行python manage.py migrate
之前),我立即从所有列中删除了blank=True, null=True
。然后,我再次运行python manage.py makemigrations
。我可以选择自己更改列。
然后我运行了python manage.py migrate
,一切正常!
答案 11 :(得分:0)
基本上我解决了这个问题,将 null=True
添加到模型中。
例如:
我试图在现有的数据库模块中添加 phone_number。
phone_number = models.CharField(max_length=10)
我之前遇到过这个错误:
<块引用>您正在尝试向客户添加不可为空的字段“电话号码” 没有默认值;我们不能这样做(数据库需要一些东西 填充现有行)。请选择修复:
放置后
phone_number = models.CharField(max_length=10, null=True)
python manage.py makemigrations
Migrations for 'collegekhajagharapp':
collegekhajagharapp\migrations\0002_customer_phone_number.py
- Add field phone_number to customer
答案 12 :(得分:0)
在models.py
中 class UserProfile(models.Model):
user = models.OneToOneField(User)
website = models.URLField(blank=True)
new_field = models.CharField(max_length=140, default="some_value")
您需要添加一些默认值。
答案 13 :(得分:0)
如果可以截断相关模型的表,可以在提示中指定一次性的默认值None
。迁移将具有多余的default=None
,而您的代码没有默认值。可以很好地应用它,因为表中不再有需要默认的数据。
答案 14 :(得分:0)
您不能添加对内部已经有数据的表的引用。
更改:
user = models.OneToOneField(User)
收件人:
user = models.OneToOneField(User, default = "")
这样做:
python manage.py makemigrations
python manage.py migrate
再次更改:
user = models.OneToOneField(User)
再次迁移:
python manage.py makemigrations
python manage.py migrate
答案 15 :(得分:0)
Django实际上说的是:
Userprofile表中包含数据,可能有
new_field
个值 哪些是null,但我不知道,所以你确定要标记 属性为非可空,因为如果你这样做,你可能会收到错误 有值为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
玩得开心!
答案 16 :(得分:-1)
如果SSH提供了2个选项,请选择数字1,然后输入“无”。只是……暂时。