我在下面定义了模型和获取
错误:You are trying to add a non-nullable field 'user' to videodata without a default; we can't do that
models.py
class User(Model):
userID = models.IntegerField()
userName = models.CharField(max_length=40)
email = models.EmailField()
class Meta:
ordering = ['userName']
verbose_name = 'User MetaData'
verbose_name_plural = 'Users MetaData'
def __unicode__(self):
return str(self.userName)
class VideoData(Model):
video = models.CharField(max_length=40)
time = models.IntegerField()
user = models.ForeignKey(User, related_name='User')
class Meta:
verbose_name = 'User_Video MetaData'
我做错了????
正如错误所说,VideoData上的用户字段不允许为空,因此您要么需要给它一个默认用户,要么允许为空。最简单的方法是允许为空。
user = models.ForeignKey(User, related_name='User', null=True)
或者有一个默认用户
user = models.ForeignKey(User, related_name='User', default=<have your default user id here>)
我的OneToOneField遇到了同样的问题。并且,我所做的是删除所有迁移文件(在您的应用程序下的migrations
目录下),并运行:
python manage.py makemigrations
和
python manage.py migrate
我不知道为什么,但它在我的情况下有效。试试我上面写的不会有什么坏处的。
祝你好运!
下面是我修复相同问题的方法
- 注释videodata中的外键引用并运行makemigrations&migrate
- 在admins.py中添加模型,并在 表中添加新条目
- 现在取消外键引用的注释并提供一个default=1 .运行make migrations并迁移
- 删除外键字段中的default=1
希望这对你有帮助。当你每次遇到这些错误时,这个解决方案都会起作用。
我是这样做的:
- change
requirement = models.ForeignKey(Requirement)
torequirement = models.ForeignKey(Requirement, null=True)
- 运行makemigrations&migrate
- change back
requirement = models.ForeignKey(Requirement, null=True)
torequirement = models.ForeignKey(Requirement)
- 运行makemigrations&migrate .
我猜django-orm关于foreignKey的规则是:
- 允许第一次创建表时foreignKey为null
- 拒绝添加为空的foreignKey,因为之前插入到表中的数据的foreignKey将为空,这违背了程序员的意愿 允许将foreignKey从not null更改为null。
当您在models.py文件中进行大量更改时,有时会发生问题(在我的情况下,它与ImageField非空字段有关)。而不是现场问题。一个解决方案是django 2.0.2, python 3.6.4, mysql 5.7.21
- 删除迁移文件夹
general_app/migrations/*.py
中的所有文件,除__init__.py
外,请小心。
您可以检查问题是否已解决,如果没有:
- 重复上面的步骤,和
- 删除你的数据库(例如mysql的
mysql> DROP DATABASE <name_db>
) - 现在创建一个新的名称相同的
mysql> CREATE DATABASE <name_db>
。
这些步骤解决了我的问题。现在您可以正常运行了:
$ python manage.py makemigrations
$ python manage.py migrate
我也遇到过同样的问题:…非空字段'user'到videodata…
模型:可视数据
字段:用户
只需在model的user字段中再添加一个attr: Videodata: default= "
问题发生时,我使用TextField()。我发现我以前的迁移文件以某种方式覆盖了新字段。在重新迁移之前清理以前的迁移文件可以解决这个问题。