在Django中设置Model字段为必填字段

3lxsmp7m  于 2023-03-24  发布在  Go
关注(0)|答案(3)|浏览(247)

Django不会在模型/数据库级别强制执行NOT NULL。device_serial不应该有空''或null

class Device(models.Model):
       device_serial = models.CharField(max_length=36, unique=True, null=False, blank=False)
       ....etc

下面的语句完全正常!我希望它失败,因为device_serial是必需的。它不应该接受空字符串''

Device.objects.create(device_serial='')

如何在模型/数据库级别设置必填字段?我可能在这里做错了什么?我不知道我哪里出错了。我尝试''. strp()将空字符串转换为None,但它不起作用

v09wglhw

v09wglhw1#

对于数据库,只允许null/not null,由null=True/False处理,默认为Falseblank=True/False仅用于管理页面。
字符串''不被认为是null,这就是为什么当你有null=False约束时,它会被数据库接受。
如果你想在数据库级别避免空字符串,你可以在模型本身覆盖save(),并在device_serial设置为空字符串时引发异常,例如:

from django.core.exceptions import ValidationError

class Device(models.Model):
    device_serial = models.CharField(max_length=36, unique=True)

    def save(self, *args, **kwargs):
        if self.device_serial == '':
            raise ValidationError('device_serial cannot be empty')
        super().save(*args, **kwargs)

现在,当你尝试创建一个空字符串的对象(调用save())时,将引发以下异常:

django.core.exceptions.ValidationError: ['device_serial cannot be empty']
tjjdgumg

tjjdgumg2#

Mohd的回答奏效了!或者,DB级别的检查约束也奏效了。

class Meta:
    constraints = [
        models.CheckConstraint(check=~models.Q(device_serial=''), name='chk_device_device_serial')
    ]
pes8fvy9

pes8fvy93#

在我的情况下,通过在字段定义中设置default=None就足够了。
在您的情况下:

class Device(models.Model):
       device_serial = models.CharField(max_length=36, unique=True, default=None)

我已经删除了null=Falseblank=False,因为它是默认值。

相关问题