2

我有以下模型:

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 来保存一个未定义 refer_code 的用户实例:

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

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

更新

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

4

1 回答 1

3

你的值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)

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


现在更新 Django 的新功能可用:

Django 的约束允许您添加自定义数据库约束:

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)

    class Meta:
        constraints = [
            models.CheckConstraint(
                check=(~models.Q(referral_code='')),
                name='referral_code_populated',
            )
        ]
于 2017-10-06T10:01:54.823 回答