2017-05-25 44 views
0

尝试创建没有电子邮件的第二个用户时,出现duplicate key value violates unique constraint "users_user_email_key" DETAIL: Key (email)=(None) already exists.错误。Django唯一字段引发错误为无值

电子邮件字段定义:

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 

我在做什么错在这里?所有的意见都表示赞赏,谢谢!

+0

remove unique = True并检查'clean_mail'上的重复内容 – Meska

回答

0

这是一个非常好的信息。你有一个对其有唯一约束的字段,并且你允许它为空。如果你有一个空值电子邮件,你不能有另一个,因为这会违反你的独特约束。

您应该在这里考虑设计。如果您允许用户在您的系统中没有电子邮件地址,您需要删除唯一的限制。另一种选择是创建一个唯一的组合键,将电子邮件与非空字段组合在一起,但是对于电子邮件而言是唯一的(如果需要,可以使用更多字段)。但是,您可能会通过这样做来浑浊业务需求。如果您不关心数据完整性或有效性,还可以将随机ID或sequence.next_val作为电子邮件地址插入,但此时您变得非常肮脏。

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

+0

这很有道理,但这是一种独特的情况,需要一些额外的灵活性。我已经实现了没有问题的类似解决方案,这就是为什么我想知道这里有什么问题。 请参阅https://stackoverflow.com/questions/454436/unique-fields-that-allow-nulls-in-django – apardes

+0

它看起来好像sqlite不强制NULL值的唯一性,这违背了SQL标准(请参阅#26在这里:https://sqlite.org/faq.html#q26)。我的猜测是python None不等于sqlite NULL,因此正在检查唯一性。 –