保存null = False的空字段时没有异常 - Django

时间:2017-10-06 09:57:24

标签: python django django-models django-model-field

我有以下型号:

class User(models.Model):
    email = models.EmailField(max_length=254, null=False, unique=True)
    referral_code = models.CharField(max_length=10, null=False, unique=True)

使用Django shell来保存带有referdecode undefined的用户实例:

u = User(email="test@example.com")
u.save()

这没有引起异常。我的理解是null = False需要设置referral_code - 这不是这种情况吗?我将如何实现这种行为?

更新

我注意到该字段设置为u.referral_code='',因此在给定唯一性约束的情况下,当我尝试使用新实例重复该过程时,这会引发异常。我宁愿抛出异常,因为我没有设置字段......

1 个答案:

答案 0 :(得分:2)

referral_code的值不是null,而是''(空白字符串)。这是CharField的默认值。

更新了问题:

通过覆盖模型上的save,可以在数据存储到数据库之前引发错误

class User(models.Model):
    email = models.EmailField(max_length=254, null=False, unique=True)
    referral_code = models.CharField(max_length=10, null=False, unique=True)

    def save(self, *args, **kwargs):
        assert self.email, "The 'email' field must be populated."
        super().save(*args, **kwargs)

应该注意的是,在可能的情况下,这不是表格验证的首选。