2017-05-25 11 views
0

電子メールを持たない第2のユーザーを作成しようとすると、duplicate key value violates unique constraint "users_user_email_key" DETAIL: Key (email)=(None) already exists.エラーが発生します。Django UniqueフィールドがNoneの値を返します。

メールフィールド定義:

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

は、私がここで間違って何をやっている:ユーザーの作成フォームから

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

?すべての入力がありがとう、ありがとう!

+0

remove unique = Trueと 'clean_mail'で重複をチェックしてください – Meska

答えて

0

これはかなり良いメッセージです。あなたはそれにユニークな制約を持つフィールドを持っていて、それをヌルにすることができます。 null値の電子メールが1つある場合は、独自の制約に違反する可能性があるため、別のnull値を持つことはできません。

ここでデザインについて考える必要があります。ユーザーが電子メールアドレスなしでシステムに入ることを許可する場合は、一意制約を削除する必要があります。もう1つの選択肢は、電子メールと非ヌルフィールドとを組み合わせるユニークなコンポジットキーを作成することですが、電子メール(または必要に応じてより多くのフィールド)でユニークになるものもあります。しかし、これを行うことによって、ビジネス要件を泥沼にし始めます。データの整合性や妥当性に関心がない場合は、電子メールアドレスとしてランダム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に相当しないため、一意性がチェックされています。 –

関連する問題