Django FileField不遵守null = False参数

时间:2019-02-15 16:25:54

标签: python django

我有一个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,
            },
        ),
    ]

3 个答案:

答案 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)

默认情况下,每个模型字段的

nullblack为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)