Djang的未知整数错误

2024-03-29 11:48:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个小项目,通过DjangoLatex来创建我的账单,直到今天,这两个项目都工作得非常完美。现在,当我尝试添加另一个客户时,Django抛出

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)

我发誓,我没有对数据库(Postgres)进行任何迁移或其他更改。Django正在处理对象的创建。是什么导致了这个错误以及如何修复它?你知道吗


Tags: 项目djangonameselftrueadminmodelslength
1条回答
网友
1楼 · 发布于 2024-03-29 11:48:13

这个错误是由数据库引起的,因为django想添加一个ID(=4)已经在使用的新列。你知道吗

要进一步调查,您需要找到应用程序中负责创建ID的部分。Django通常将此任务委托给您的数据库。对于postgres,使用数据类型^{}。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));

相关问题 更多 >