2017-02-19 54 views
0

所以我有這個小項目,通過DjangoLatex創建我的帳單,直到今天工作完美無瑕。現在,當我嘗試添加另一負荷消費,Django拋出在Django Unkown IntegrityError

duplicate key value violates unique constraint "kunden_kundearbeitsamt_pkey" 
DETAIL: Key (id)=(4) already exists. 


這是有問題的模型定義:

class Kunde(models.Model): 
    name = models.CharField('Name', max_length = 200) 
    vorname = models.CharField('Vorname', max_length = 200) 
    geburtsdatum = models.DateField('Geburtsdatum', max_length = 200) 
    untersuchungsdatum = models.DateField('Untersuchungsdatum', max_length = 200) 

    class Meta: 
     abstract = True 

class KundeArbeitsamt(Kunde): 
    kundennummer = models.CharField('Kundennummer', max_length = 100) 
    bglnummer = models.CharField('BGL-Nummer', max_length = 100) 
    empfaenger = models.ForeignKey('rechnungen.NumberToEmpfaenger', blank = True, null = True) 

    class Meta: 
     verbose_name = "Proband Arbeitsamt" 
     verbose_name_plural = "Proband Arbeitsamt" 

    def __str__(self): 
     return '{}, {}'.format(self.name, self.vorname) 


在其中創建對象的管理部分(沒有什麼特別的,我猜):

from django.contrib import admin 
from .models import KundeArbeitsamt 

class KundeArbeitsamtAdmin(admin.ModelAdmin): 
    ordering = ('name',) 

admin.site.register(KundeArbeitsamt, KundeArbeitsamtAdmin) 

我發誓,我沒有做任何遷移或其他無論如何,er變成了數據庫(Postgres)。 Django正在處理對象的創建。什麼是導致這個錯誤,以及如何解決它?

+0

哪個數據庫在後面呢? – dahrens

+2

什麼是創建對象的代碼?你是手動設置ID還是讓Django處理? – kichik

+0

@kichik:Django,更新了這個問題。這就是模型的所有代碼。 – Jan

回答

1

這個錯誤是由您的數據庫引發的,因爲django想添加一個ID爲(=4)的新列已經在使用。

要進一步調查,您需要找到負責創建ID的應用程序部分。 Django通常將這個任務委託給你的數據庫。如果使用postgres,則使用serial的數據類型。 Postgres使用所謂的序列用於此目的,並生成並執行你的SQL語句:

CREATE SEQUENCE tablename_colname_seq; 
CREATE TABLE tablename (
    colname integer NOT NULL DEFAULT nextval('tablename_colname_seq') 
); 
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname; 

現在我開始檢查數據庫理智這樣的:

-- views contents of the table 
SELECT * FROM kunden_kundearbeitsamt; 
-- check the sequence 
select currval('kunden_kundearbeitsamt_id_seq'); 

如果第一次顯示4條記錄與ID 1,2,3和4和順序回答與4一切都沒事。我會繼續與Django的來源,找出爲什麼他們傳遞一個ID創建對象,而不依賴於序列。在這種情況下,django shell可能是一個很好的開始。

否則,我會修復序列,並問自己,這是怎麼回事,因爲它幾乎不是postgres在這一點上犯了錯誤的情況。

SELECT setval('kunden_kundearbeitsamt_id_seq', (SELECT max(id) FROM kunden_kundearbeitsamt)); 
+0

輝煌,感謝您的背景資料。我結束了使用'SELECT setval('kunden_kundearbeitsamt_id_seq',(SELECT max(id)FROM kunden_kundearbeitsamt));'改變序列的值。 – Jan

+1

我已將您的解決方案添加到答案中。 – dahrens

+0

我記得通過'Postico'插入了可能導致錯誤的條目。再次感謝這個良好的答案,並保持良好的工作! – Jan