Python 错误:";您试图添加一个不可为空的字段";
我定义了下面的模型并获得 错误:Python 错误:";您试图添加一个不可为空的字段";,python,django,Python,Django,我定义了下面的模型并获得 错误:您试图在没有默认值的情况下向videodata添加不可为空的字段“user”;我们不能那样做 models.py class User(Model): userID = models.IntegerField() userName = models.CharField(max_length=40) email = models.EmailField() class Meta: ordering = ['userNam
您试图在没有默认值的情况下向videodata添加不可为空的字段“user”;我们不能那样做
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>)
user=models.ForeignKey(user,related\u name='user',default=)
我的OneToOneField也遇到了同样的问题。我所做的是删除所有迁移文件(位于应用程序下的migrations
目录下),然后运行:
python manage.py makemigrations
及
我不知道为什么,但对我来说是有效的。试试我上面写的不会伤害你的
祝你好运 以下是我为解决同一问题所做的工作
requirement=models.ForeignKey(requirement)
更改为requirement=models.ForeignKey(requirement,null=True)
requirement=models.ForeignKey(requirement,null=True)
更改回requirement=models.ForeignKey(requirement)
当您在models.py文件中进行大量更改时(在我的示例中,它与ImageField不可为null的字段相关),有时会出现问题。而不是现场问题。django 2.0.2、python 3.6.4、mysql 5.7.21中的一个解决方案
- 删除迁移文件夹中的所有文件
,除了general\u app/migrations/*.py
,请小心\uuuu init\uuuuuu.py
- 重复上述步骤,然后
- 删除您的数据库(例如,在mysql
)mysql>中删除数据库
- 现在创建一个同名的新数据库
mysql>createdatabase
$ python manage.py makemigrations
$ python manage.py migrate
我也遇到了同样的问题:…视频数据的不可空字段“user” 型号:视频数据 字段:用户
只需在模型Videodata的用户字段中再添加一个attr:default=''如果您的本地环境中有无意义的数据,则该模型的可能副本效果良好,但如果是生产环境,则必须应用默认值,无论您是否想要。我们可以删除学习项目的迁移。在实时项目中,不建议删除迁移文件。也应该有其他的解决方案。这是一个危险的建议,它会破坏迁移和数据库状态。重置迁移将达到目的,是的(因为您迫使django认为数据库是空的),但它将丢失迁移文件和数据库迁移状态之间的同步。如果在执行此操作之前未进行迁移就更改了模型,那么您还会发现django不再检测到更改,现在留下的模型和一致性错误将在下次迁移尝试时出现。如果你真的想这样做的话,你必须核化数据库并重新创建它。在数据库级别上,一个外键列需要一个默认值是完全有缺陷和错误的。Django迫使您使数据架构出错。也不支持复合外键。真是太遗憾了。我给出了两个解决问题的方法。Django没有强制要求默认值。我可以想到很多情况下,添加默认外键是可以接受的。遗憾的是,这是唯一可行的解决方案。@Feralesfuture我很好奇,你会认为这种解决方案不是“悲哀”的。这里没有问题——如果你只是定义模型,为什么这会是一个问题?如果没有预先存在的数据,FK默认值甚至意味着什么?如果要执行此操作,需要重新创建数据库(使用
dumpdata
进行备份),否则将以中断的迁移结束。请注意,在生产环境中,重新创建数据库可能不是一个选项。
$ python manage.py makemigrations
$ python manage.py migrate