2017-02-14 36 views
0

enc_idにNULLを許可する必要がありますが、値がnullでない場合は、これらの値を一意にする必要があります。別のインスタンスを追加しようとDjangoは重複するキー値NULLを挿入できません

class Intake(models.Model): 
    id = models.AutoField(primary_key=True) 
    enc_id = models.IntegerField(blank=True, null=True, unique=True) 
    enc_date = models.DateField(null=True) 
    enrollment = models.ForeignKey('Enrollment') 

エラーenc_idなし::ここに私のモデルです

django.db.utils.IntegrityError: ('23000', "[23000] [FreeTDS][SQL Server]Violation of UNIQUE KEY constraint 'UQ__caseload__E136D21F4222D4EF'. Cannot insert duplicate key in object 'dbo.caseload_intake'. The duplicate key value is (<NULL>). (2627) (SQLExecDirectW)") 

私は(thisといくつかの解決Djangoの問題を含む)読んだによると、blank=True, null=True, unique=Trueを持つべきです重複するNULLを持つことができますが、行ってはいけません。ちょうど私のDBを再作成しましたが、それでも整合性エラーが発生します。

私はDjango 1.10とMS SQL Server 10を実行しています。それは私に多くの意味がありません

+2

カラムにユニークなインデックスがあります。つまり、1つ以上のヌルを持つことはできません。それがどのように機能するかです。このための「回避」はありません。複数のNULL行を持つためには、一意索引を削除する必要があります。 –

答えて

1

ロージーは、あなたが重複NULLを持つことができるユニークなフィールドを持っています。あなたは制約を取り除き、このルールを他の手段で強化するのはどうですか?例えば

、あなたはそれを行うためのSaveメソッドをオーバーライドすることができます。..

def save(self, *args, **kwargs): 
    # place your logic here 

私は、これは理にかなって願っていますが、そのようなあなたが定義されている1つとして、DBレベルでのルールは非常に制限されます。

+0

こんにちは!はい、それは非常に特殊な制約で、NULLが許されている、データは単純に存在しない場合もあります。それがあるところでは、繰り返しはありえません。私はこのDjangoの変更から間違った考えを持っているとしますか? https://github.com/django/django/commit/49ef21d9ea - あなたの提案したようなsaveメソッドをオーバーライドし、それ以外の場合はunique_togetherのいくつかの制約に戻ります。ありがとうございました! –

+0

確かに、一意でないフィールド(と主キー)を持つunique_togetherを使用して、2フィールドの一意のタプルを作成することができます。 – bobleujr

関連する問題