[英]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.