您正在尝试向用户配置文件添加一个非空字段 'new_field',但没有默认值。
您正在尝试向用户配置文件添加一个非空字段 'new_field',但没有默认值。
我知道从Django 1.7开始,我不需要使用South或任何其他迁移系统,所以我只使用简单的命令python manage.py makemigrations
\n然而,我得到的只是这个错误:\n您正在尝试向userprofile添加一个非空字段\'new_field\',但没有默认值;我们不能这样做(数据库需要一些内容来填充现有行)。
\n这是models.py的代码:\n
class UserProfile(models.Model): user = models.OneToOneField(User) website = models.URLField(blank=True) new_field = models.CharField(max_length=140)
\n有哪些选项可供选择?
在给UserProfile模型添加一个非空字段 'new_field' 时,出现了 'You are trying to add a non-nullable field 'new_field' to userprofile without a default' 的问题。这个问题的原因是在添加新字段时,没有为该字段提供默认值。
解决这个问题的方法有几种。一种方法是为 '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' 作为有效输入,则还需要添加 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)
需要注意的是,避免在基于字符串的字段(如CharField和TextField)上使用null。如果一个基于字符串的字段具有null=True,那么它就有两个可能的“no data”值:NULL和空字符串。
参考文献:Model field reference
在这个问题中,出现了一个非空字段 'new_field' 添加到用户配置文件(userprofile)中的问题,但没有默认值。出现这个问题的原因是在添加字段时没有指定默认值。解决方法是提供一个默认值,可以使用以下代码添加默认值:
new_field = models.CharField(max_length=140, default='SOME STRING')
如果需要将 new_field 的值设置为一个网站字段的副本,可以使用以下代码:
default = website
但是这种方法无法解决问题。解决方法是首先使用一个虚假的默认值进行迁移,然后创建一个数据迁移,通过迭代每条记录并将 new_field 设置为 website 的值。
另外,对于 CharField 字段来说,默认值应该是可选的。但是,这并没有真正回答问题,因为问题明确指出"没有默认值"。
为了解决这个问题,我们需要为添加的字段指定一个默认值,并且可以通过创建数据迁移来设置字段的值。
问题的原因:在将非空字段“new_field”添加到用户配置文件(userprofile)时,没有提供默认值。
解决方法:删除迁移文件和数据库中的迁移记录,然后重新进行迁移。如果之前创建了超级用户,则可能需要重新创建该用户。同时,确保不删除迁移文件夹中的__init__.py文件。如果仍然遇到问题,可以使用python manage.py sqlmigrate命令来查看具体的迁移信息。
如果您在开发的早期阶段,并且不关心当前数据库中的数据,可以直接删除迁移文件和数据库中的迁移记录,然后重新进行迁移。首先,需要清理迁移文件夹并从表(django_migrations)中删除相应的行。
rm your_app/migrations/*
注意:不要删除迁移文件夹中的__init__.py文件。
rm db.sqlite3 python manage.py makemigrations python manage.py migrate
如果之前为Django的管理后台应用程序创建了超级用户,则可能需要重新创建该用户。
另外,您还需要清理迁移记录表,例如:
mysql -u[user] [database] -e "delete from django_migrations where app=[your_app]"
这是一种方法。我认为Django在迁移和模型检测等方面做得不好,希望能对此进行重大更新。
我已经从迁移中删除了所有文件,并从django_migrations表中删除了所有行,现在当我运行迁移时出现了“django.db.migrations.exceptions.NodeNotFoundError: Migration stories.0001_initial dependencies reference nonexistent parent node ('sources', '0002_auto_20180903_1224')”的错误。
另外,请确保不要删除迁移文件夹中的__init__.py文件,或者在删除后恢复该文件,否则makemigrations将无法正常工作。详情请参考stackoverflow.com/a/46362750/1649917。
有时候,当不清楚Django指的是哪个字段时,可以使用python manage.py sqlmigrate命令来查看具体的迁移信息。
当需要保留有意义的数据时,这是我常用的方法。在这种情况下,删除整个目录和django_migrations表中的相应行可能会比较麻烦。
总之,解决此问题的方法是删除迁移文件和数据库中的迁移记录,然后重新进行迁移,并确保提供默认值或正确配置字段。