簡體   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