Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django文件字段不包含null=False参数_Python_Django - Fatal编程技术网

Python Django文件字段不包含null=False参数

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') 编辑:

我有一个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 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()
一个模型实例,而该实例没有所需字符字段的值。它也不会触发任何数据库约束冲突。