我有一个Django FileField,它设置为不能为空。但是,它的行为就像可以为空。
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,
},
),
]
答案 0 :(得分:1)
问题不在于您的字段定义。手动创建模型实例时,这与验证有关。由于您没有使用ModelForm,因此您需要自己执行完全验证。
使用此示例:
from django.core.exceptions import ValidationError
thing = Thing(thing_id='123')
try:
thing.full_clean()
thing.save()
except ValidationError:
# Handle validation issues.
阅读文档中的此部分:https://docs.djangoproject.com/en/2.1/ref/models/instances/#validating-objects
从那里报价:
请注意,调用时不会自动调用full_clean() 您模型的save()方法。您需要在手动时调用它 想要为您自己手动创建的模型执行一步式验证 型号
答案 1 :(得分:0)
null
和black
为False link。不需要添加这些。
from django.db import models
class Thing(models.Model):
document = models.FileField()
thing_id = models.CharField()
答案 2 :(得分:0)
您可以直接在覆盖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)