繁体   English   中英

Django 唯一字段为 None 值抛出错误

[英]Django Unique Field Throws Error for None Value

我得到一个duplicate key value violates unique constraint "users_user_email_key" DETAIL: Key (email)=(None) already exists. 尝试创建没有电子邮件的第二个用户时出错。

电子邮件字段定义:

email = models.EmailField(verbose_name='email address', max_length=255, unique=True, null = True, blank = True)

从创建用户的表单中:

def clean_email(self):
    email = self.cleaned_data.get('email')
    if email:
        if email == "":
            return None
        else:
            return email
    else:
        return None

我在这里做错了什么? 感谢所有输入,谢谢!

这是一个很好的消息。 您有一个具有唯一约束的字段,并且您允许它为空。 如果您有一个空值电子邮件,则不能有另一个,因为这会违反您的唯一约束。

你应该考虑这里的设计。 如果您允许用户在没有电子邮件地址的情况下进入您的系统,则需要删除唯一约束。 另一种选择是创建一个唯一的复合键,将电子邮件与一个非空字段结合起来,但一个与电子邮件(或更多字段,如果需要)是唯一的。 但是,您可能会因为这样做而开始混淆业务需求。 如果您不关心数据完整性或有效性,您还可以插入一个随机 ID 或 sequence.next_val 作为电子邮件地址,但此时您会变得非常脏。

这里最简单的设计和最强的完整性不仅需要电子邮件地址,还要确认它是有效的电子邮件地址或至少是电子邮件地址格式。 您将保留唯一约束但不允许空值,并为所提供的值添加一些前端和后端支持。

如果您将空字符串移动到None转换到表单的save方法中,它将按照您的描述工作。 前任:

def save(self, commit=True):
    if self.instance.email == '':
        self.instance.email = None
    return super().save(commit)

这是我发现的转换唯一(如果存在)但可选的字符字段的最干净的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM