2017-02-14 60 views
0

我需要在enc_id中允許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應讓我有重複的空值,但沒有去。我已經重新創建了我的數據庫,以防萬一,並且還會引發完整性錯誤。

我正在運行Django 1.10和MS SQL Server 10.任何想法?

+2

您在列上有唯一的索引。這意味着你不能有多於1個null。這就是它的工作原理。這沒有「解決辦法」。對於你有多個NULL行,你將不得不刪除唯一的索引。 –

回答

1

羅西,

它沒有很多的意義,我有一個獨特的領域,你可以有重複的空值。你怎樣去除約束並通過其他方式加強這個規則?

例如,你可以在爲了做到這一點覆蓋的方法保存..

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

我希望這是有道理的,但在數據庫級別的規則,如您所定義極其限制之一。 。

+0

嗨!是的,這是一個非常特定的約束條件,允許使用NULL,在某些情況下數據根本不存在。雖然它在哪裏,但不能重複。假設我從這個Django變更中得到了錯誤的想法? https://github.com/django/django/commit/49ef21d9ea - 無論如何要重寫像你所建議的保存方法,否則回落到一些unique_together約束。謝謝! –

+0

當然,你可以使用unique_together與一個非唯一的字段(和你的主鍵)來創建一個2字段唯一元組! – bobleujr