Python Django文件字段不包含null=False参数
我有一个Django文件字段,它被设置为不可为空。然而,它的行为就像它是可空的一样Python Django文件字段不包含null=False参数,python,django,Python,Django,我有一个Django文件字段,它被设置为不可为空。然而,它的行为就像它是可空的一样 class Thing(models.Model): document = models.FileField(null=False, blank=False) thing_id = models.CharField() # This does not raise but I would like it to Thing.objects.create(thing_id='123') 编辑:
class Thing(models.Model):
document = models.FileField(null=False, blank=False)
thing_id = models.CharField()
# This does not raise but I would like it to
Thing.objects.create(thing_id='123')
编辑:迁移
class Migration(migrations.Migration):
dependencies = [
('data_source', '0002_auto_20190212_1913'),
]
operations = [
migrations.CreateModel(
name='Thing',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('document', models.FileField(upload_to='')),
('thing_id', models.CharField(default=None, max_length=200)),
],
options={
'abstract': False,
},
),
]
默认情况下,每个模型字段的
null
和black
均为False。不需要添加这些
from django.db import models
class Thing(models.Model):
document = models.FileField()
thing_id = models.CharField()
问题不在于字段定义。这与手动创建模型实例时的验证有关。您需要自己执行完整的验证,因为您没有使用ModelForm 使用以下示例:
from django.core.exceptions import ValidationError
thing = Thing(thing_id='123')
try:
thing.full_clean()
thing.save()
except ValidationError:
# Handle validation issues.
请阅读文档中的本节:
从那里引述:
请注意,调用时不会自动调用full_clean()
您的模型的save()方法。您需要在安装时手动调用它
要为自己手动创建的模型运行一步模型验证吗
模型
您可以直接在模型覆盖
save()
方法中添加验证:
class Thing(models.Model):
document = models.FileField(null=False, blank=False, default=None)
thing_id = models.CharField(max_length=200)
def save(self, *args, **kwargs):
self.full_clean()
super().save(*args, **kwargs)
这并不能解决我遇到的问题。请添加
Thing
表的create migrations.py。顺便问一句,您的BaseModel是什么?您是否也可以添加该模型的定义。添加了迁移,而忽略BaseModel它只是添加了一些字段。要在任何地方捕获异常,或者扩展验证错误捕获else,或者添加try-except
block?表单是什么样子的?您正在覆盖那里的设置吗?没有表单,这是一个直接的ORM调用@OHLR。当您将该对象保存到变量中,然后使用created\u thing.full\u clean()
手动运行验证时会发生什么情况?其行为与2.1相同。7@NotHilaryClinton我相信您遇到的行为是a.save()
(发生在.create()
)中)不会执行完全验证。因为您没有使用ModelForm,所以您必须自己进行验证。因此,这并不是因为您的模型有问题(运行full\u clean()时出现验证错误这一事实表明了这一点)
。此字段应在数据库级别进行验证,而不是在这里。@NotHilaryClinton我正试图找到一个正式的解释,但我的解释很简短。以下是我对它的理解。blank
是非数据库级别,null
是数据库级别()。但是空文件字段实际上并不在数据库中存储NULL
,它存储一个空字符串,类似于CharField(请参见将NULL
与这些字段一起使用)。因此,从技术上讲,您的字段通过了db验证(因为“”!=NULL)而且您必须自己检查非db。@这类似于您可以手动.save()
一个模型实例,而该实例没有所需字符字段的值。它也不会触发任何数据库约束冲突。