Django NULL约束失败

时间:2018-04-10 14:36:16

标签: python django django-models

一旦将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开始。 我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

如果您想保持字段值唯一,可以写如下:

name = models.CharField(unique=True, max_length=128)

注意:当您未提及nullblank时,除非您希望允许在模型中存储空值,否则它的默认值为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上运行此代码。