2017-02-19 5 views
0

Also habe ich dieses kleine Projekt, um meine Rechnungen über Django und Latex zu erstellen, die bis heute einwandfrei funktionierte. Wenn ich jetzt versuchen, einen anderen Kunden hinzuzufügen, wirft DjangoUnknown IntegrityError in Django

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


Das sind die Modelldefinitionen in Frage sind:

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) 


Der Admin Teil, in dem das Objekt erstellt wird (nichts Besonderes, ich rate):

from django.contrib import admin 
from .models import KundeArbeitsamt 

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

admin.site.register(KundeArbeitsamt, KundeArbeitsamtAdmin) 

Ich schwöre, ich habe keine Migrationen oder oth gemacht Änderungen an der Datenbank (Postgres) Django behandelt die Erstellung der Objekte. Was verursacht diesen Fehler und wie kann er behoben werden?

+0

Welche Datenbank steckt dahinter? – dahrens

+2

Wie lautet der Code zum Erstellen des Objekts? Legen Sie die ID manuell fest oder lassen Sie Django das handhaben? – kichik

+0

@kichik: Django, aktualisiert die Frage. Das ist der Code, den das Modell hat. – Jan

Antwort

1

Dieser Fehler wird von Ihrer Datenbank verursacht, weil django eine neue Spalte mit einer bereits verwendeten ID (=4) hinzufügen möchte.

Um weiter zu untersuchen, müssen Sie den Teil Ihrer App finden, der für die Erstellung der IDs zuständig ist. Django delegiert diese Aufgabe normalerweise an Ihre Datenbank. Bei Postgres wird der Datentyp serial verwendet. Postgres verwendet so genannte Sequenzen, die für diesen Zweck und erzeugt und führt die folgende SQL für Sie:

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

Wenn die ersten Shows 4 Datensätze:

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; 

ich jetzt mit der Überprüfung der Datenbank geistige Gesundheit so beginnen würde mit IDs 1, 2, 3 und 4 und die Sequenz antwortet mit 4 alles ist in Ordnung. Ich würde mit den Django-Quellen fortfahren, um herauszufinden, warum sie beim Erstellen eines Objekts eine ID übergeben, ohne sich auf die Sequenz zu verlassen. Die Django-Shell könnte in diesem Fall ein guter Anfang sein.

Sonst würde ich die Sequenz reparieren und mich fragen, wie das passiert ist, da es kaum der Fall ist, dass Postgres an dieser Stelle Fehler macht.

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

Brilliant, danke für die Hintergrundinfo. Am Ende habe ich 'SELECT setval ('kunden_kundearbeitsamt_id_seq', (SELECT max (id) FROM kunden_kundearbeitsamt));' verwendet, um den Wert der Sequenz zu ändern. – Jan

+1

Ich habe Ihre Lösung zu der Antwort hinzugefügt. – dahrens

+0

Ich erinnere mich, Einträge über 'Postico' eingefügt zu haben, die den Fehler verursacht haben könnten. Danke nochmal für diese gute Antwort und mach weiter so! – Jan

Verwandte Themen