根据Django中的要求设置模型字段
Django不会在模型/数据库级别强制NOTNULL。设备_序列不应具有空白“”或null根据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串行。它不应接受空字符串“” 如何在模型/数据库级别创建必填字段?我可能做错了什么
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),但忘了取出它。它不起作用。回到您的解决方案'