一旦将null值存储在不允许null的字段中,我想要引发IntegrityError。该模型如下:
javascript:(function() {$(function() {var columnA = $("#search"); var columnB = $("#search_to"); columnA.find('[value="84"]').detach().appendTo(columnB); }) })()
get_hex_uuid函数有效,我已经测试过了。当我开始按如下方式保存Domain对象时,这一切都失败了:
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()
显然,这两个都应该引发错误,因为它们的名称值为Domain().save()
,但它不会发生。现在,当我使用Domain.objects.all()选择其中一个对象时,我确实将其名称值存储为
None/NULL
所以我开始检查Domain对象的正常初始化:
>>> d = Domain.objects.all().first()
>>> d.name
>>> ''
显然它默认为>>> d = Domain()
>>> d.name
>>> ''
。为什么是这样?在我之前的经验中,属性已初始化为''
或None
。
那么为什么object属性从NULL
开始。
我该如何解决这个问题?
答案 0 :(得分:1)
如果您想保持字段值唯一,可以写如下:
name = models.CharField(unique=True, max_length=128)
注意:当您未提及null
或blank
时,除非您希望允许在模型中存储空值,否则它的默认值为False使用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)
答案 1 :(得分:1)
我认为你应该使用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
上运行此代码。