2017-02-19 16 views
0

私はDjangoLatexで今日まで完璧に働いた請求書を作成するこの小さなプロジェクトを持っています。私は別の衣装を追加しようとする今、DjangoDjangoの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) 

私は誓う、私は移行やothをしなかったデータベース(Postgres)に変更されます。 Djangoはオブジェクトの作成を処理しています。このエラーの原因と解決方法

+0

このデータベースはその背後にありますか? – dahrens

+2

オブジェクトを作成するコードは何ですか? idを手動で設定しているのでしょうか、それともDjangoがそれを扱えるようにしていますか? – kichik

+0

@kichik:Django、質問を更新しました。それがモデルにあるすべてのコードです。 – Jan

答えて

1

このエラーは、すでに使用中のID(=4)の新しい列をdjangoが追加しようとしているため、データベースによって発生します。

さらに調査するには、IDを作成するアプリの部分を見つける必要があります。 Djangoは通常、このタスクをデータベースに委譲します。ポストグルの場合、データタイプは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シェルが適切な場所になるかもしれません。

そうでなければ、私はシーケンスを修正し、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

関連する問題