Python Django NULL约束失败
我希望在不允许null的字段中存储null值后,引发IntegrityError。模型如下:Python Django NULL约束失败,python,django,django-models,Python,Django,Django Models,我希望在不允许null的字段中存储null值后,引发IntegrityError。模型如下: class Domain(models.Model): uuid = models.UUIDField(default=get_hex_uuid, primary_key=True, editable=False) name = models.CharField(null=False, max_length=128) d = Domain().save() get_hex_uuid函
class Domain(models.Model):
uuid = models.UUIDField(default=get_hex_uuid, primary_key=True, editable=False)
name = models.CharField(null=False, max_length=128)
d = Domain().save()
get_hex_uuid函数可以工作,我已经测试过了。当我开始按如下方式保存域对象时,这一切都失败了:
class Domain(models.Model):
uuid = models.UUIDField(default=get_hex_uuid, primary_key=True, editable=False)
name = models.CharField(null=False, max_length=128)
d = Domain().save()
或
很明显,这两种情况都会引起错误,因为它们的名称值是None/NULL
,但不会发生这种情况。现在,当我使用Domain.objects.all()选择这些对象中的任何一个时,我确实得到了它们的名称值存储为
>>> d = Domain.objects.all().first()
>>> d.name
>>> ''
所以我开始检查域对象的正常初始化:
>>> d = Domain()
>>> d.name
>>> ''
显然,它默认为'
。为什么会这样?在我以前的经验中,属性被初始化为None
或NULL
那么为什么对象属性从''
开始呢。
如何解决此问题?如果要保持字段值唯一,可以编写如下内容:
name = models.CharField(unique=True, max_length=128)
注意:当您未提及null
或blank
时,其默认值为False,除非您希望允许在模型中存储null值,否则需要使用null=True
unique=True
将确保输入的字段中没有重复记录
更改模型后,请确保应用迁移
注意:当您从shell执行查询时,并非所有的验证工作(如blank=False)都是默认值,用于确保django admin中的字段是必需的,但当您从shell执行相同的脚本时,它不会引发任何错误,您需要自己覆盖它
要引发异常,您需要覆盖save()
,如下所示:
class Domain(models.Model):
uuid = models.UUIDField(default=get_hex_uuid, primary_key=True, editable=False)
name = models.CharField(null=False, max_length=128)
def save(self, *args, **kwargs):
assert self.name, "The 'name' field can not be null it must be populated."
super().save(*args, **kwargs)
如果要保持字段值唯一,可以编写如下内容:
name = models.CharField(unique=True, max_length=128)
注意:当您未提及null
或blank
时,其默认值为False,除非您希望允许在模型中存储null值,否则需要使用null=True
unique=True
将确保输入的字段中没有重复记录
更改模型后,请确保应用迁移
注意:当您从shell执行查询时,并非所有的验证工作(如blank=False)都是默认值,用于确保django admin中的字段是必需的,但当您从shell执行相同的脚本时,它不会引发任何错误,您需要自己覆盖它
要引发异常,您需要覆盖save()
,如下所示:
class Domain(models.Model):
uuid = models.UUIDField(default=get_hex_uuid, primary_key=True, editable=False)
name = models.CharField(null=False, max_length=128)
def save(self, *args, **kwargs):
assert self.name, "The 'name' field can not be null it must be populated."
super().save(*args, **kwargs)
我认为你应该使用null=true,blank=false来达到这个效果:
class Domain(models.Model):
uuid = models.UUIDField(default=get_hex_uuid, primary_key=True, editable=False)
name = models.CharField(max_length=128, null=True)
通过这样做,您应该期望以下行为:
>>> d1 = Domain.objects.create()
>>> print(d1.name)
None
>>> d2 = Domain()
>>> d2.save()
>>> print(d2.name)
None
您使用的是哪个版本的django?我在
Django==1.11.7
上运行此代码,我认为您应该使用null=true,blank=false来实现此效果:
class Domain(models.Model):
uuid = models.UUIDField(default=get_hex_uuid, primary_key=True, editable=False)
name = models.CharField(max_length=128, null=True)
通过这样做,您应该期望以下行为:
>>> d1 = Domain.objects.create()
>>> print(d1.name)
None
>>> d2 = Domain()
>>> d2.save()
>>> print(d2.name)
None
您使用的是哪个版本的django?我在
Django==1.11.7
上运行此代码。问题不是唯一值,而是名称不应为None/nulls,因此是否允许重复名称?是的,uuid是绑定主键。例如:(63f1ac0f4a784e8d9b649fdeb345f122,'Test')
和(2f64b85fc3ac4b37bea58011108e0a17,'Test')
非常好问题不是唯一的值,而是名称不应该是None/null,所以您想允许重复名称吗?是的,uuid是绑定主键。例如:(63f1ac0f4a784e8d9b649fdeb345f122,'Test')
和(2f64b85fc3ac4b37bea58011108e0a17,'Test')
是完美的否,因为这将允许在数据库中有一个空值,这不是想要的行为否,因为这将允许在数据库中有一个空值的可能性,这不是被通缉的行为