2017-02-19 105 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