根据Django中的要求设置模型字段

根据Django中的要求设置模型字段,django,django-rest-framework,Django,Django Rest Framework,Django不会在模型/数据库级别强制NOTNULL。设备_序列不应具有空白“”或null class Device(models.Model): device_serial = models.CharField(max_length=36, unique=True, null=False, blank=False) ....etc 下面的声明完全正确!我预计它会失败,因为需要设备\u串行。它不应接受空字符串“” 如何在模型/数据库级别创建必填字段?我可能做错了什么

Django不会在模型/数据库级别强制NOTNULL。设备_序列不应具有空白“”或null

class Device(models.Model):
       device_serial = models.CharField(max_length=36, unique=True, null=False, blank=False)
       ....etc
下面的声明完全正确!我预计它会失败,因为需要设备\u串行。它不应接受空字符串“”


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

就数据库而言,它只允许由
null=True/False
处理的null/notnull,默认为
False
blank=True/False
仅用于管理页面

字符串
'
不被视为null,这就是当您有
null=False
约束时,数据库接受该字符串的原因

如果要避免数据库级别的空白字符串,可以覆盖模型本身的
save()
,并在
device\u 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']

就数据库而言,它只允许由
null=True/False
处理的null/notnull,默认为
False
blank=True/False
仅用于管理页面

字符串
'
不被视为null,这就是当您有
null=False
约束时,数据库接受该字符串的原因

如果要避免数据库级别的空白字符串,可以覆盖模型本身的
save()
,并在
device\u 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']

莫德的回答奏效了!或者,DB级别的检查约束也起作用

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

莫德的回答奏效了!或者,DB级别的检查约束也起作用

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

空字符串不为NULL,请尝试传递none。空字符串不为NULL,请尝试传递none。谢谢。你的解决方案奏效了,但我找到了解决办法。设置default=None将强制空字符串为null,这将导致create()失败。。。。device_serial=models.CharField(max_length=36,unique=True,default=None)很高兴它这么做了!,我认为设置
default=None
不会强制空字符串为null。您确定没有覆盖
save()
,并且没有使用空字符串
device\u serial
保存对象吗?因为
unique=True
约束会引发一个异常,称我的坏!对的我硬编码了Device.objects.create(Device\u serial=None),但忘了取出它。它不起作用。回到您的解决方案“谢谢。你的解决方案奏效了,但我找到了解决办法。设置default=None将强制空字符串为null,这将导致create()失败。。。。device_serial=models.CharField(max_length=36,unique=True,default=None)很高兴它这么做了!,我认为设置
default=None
不会强制空字符串为null。您确定没有覆盖
save()
,并且没有使用空字符串
device\u serial
保存对象吗?因为
unique=True
约束会引发一个异常,称我的坏!对的我硬编码了Device.objects.create(Device\u serial=None),但忘了取出它。它不起作用。回到您的解决方案'