2017-05-25 23 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,因此正在檢查唯一性。 –

相關問題