2011-05-18 104 views
14

我有一個自定義主鍵,需要在模型中的特定數據上進行設置。django中的主鍵和唯一鍵

這是不夠的,因爲嘗試插入重複號碼成功。所以現在當我取代primary_key=Trueunique=True它正常工作,並拒絕重複的數字!!。但根據這document其中使用字段)。

primary_key=True意味着null=Falseunique=True.

這讓我困惑於爲什麼 它具有一個內置的unique=True接受擺在首位 價值?

謝謝。

更新語句:

personName = models.CharField(primary_key=True,max_length=20) 

回答

13

使用帶primary_key代替AutoField

編輯:

如果不使用AutoField,你必須手動計算/設置主鍵字段的值。這很麻煩。是否有一個原因你需要ReportNumber到主鍵?您仍然可以擁有可以查詢報告的唯一報告編號以及自動遞增整數主鍵。

編輯2:

當你說重複的主鍵值是允許的,你指出什麼情況是,具有相同主鍵的現有記錄更新 - 有沒有什麼實際的兩個對象數據庫中的相同主鍵(這不可能發生)。問題在於Django的ORM層選擇UPDATE(修改現有的數據庫記錄)與INSERT INTO(創建新的數據庫記錄)。從django.db.models.base.Model.save_base()看看這個行:

if (force_update or (not force_insert and 
     manager.using(using).filter(pk=pk_val).exists())): 
    # It does already exist, so do an UPDATE. 

特別是,這個代碼片段:

manager.using(using).filter(pk=pk_val).exists() 

這是說:「如果用相同的主鍵,因爲這Model記錄在數據庫中,然後執行更新。」因此,如果您重新使用主鍵,Django會假定您正在進行更新,因此不會引發異常或錯誤。


我認爲最好的辦法是讓Django的爲你生成一個主鍵,然後有一個獨立的字段(CharField或其他)具有unique約束。

+0

@Nagaraj Tantri:我編輯了我的答案,以解決您的評論。 – mipadi 2011-05-19 17:17:36

+1

@mipadi:我的要求是關於手動設置。我理解你對'AutoFiled'的關注。但是,再次,您的解決方案將解決查詢在哪裏我希望它是AutoField。我想要的是從註冊商那裏手動輸入。再次,即使我使用** CharFiled **我會得到原來的字段替換爲新的「CharField」記錄。如果你注意到我的問題的最後一部分,我曾質疑它爲什麼不起作用?爲什麼它會在'primary_key'中替換它的默認'unique = True'? – 2011-05-20 10:59:24

+1

@Nagaraj Tantri:對。我在問爲什麼報告號碼必須成爲主要關鍵。您可以擁有一個獨特的手動輸入報告編號(您甚至可以將其編入索引以更快地查詢)以及單獨的自動生成的ID編號(也是主鍵)。 – mipadi 2011-05-20 14:54:41