我有以下模型:

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保存未定义Referral_code的用户实例:

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


这没有引起例外。我的理解是null = False将需要设置Referral_code-是不是这样?我将如何实现这种行为?

更新

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

最佳答案

您的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)


应该注意的是,在可能的情况下,这并不比形式验证更可取。

07-24 09:53
查看更多