Django添加新记录错误:重复键值违反唯一约束条件 "",Django ID与数据库不同步。

5
我开发了一个 Django 应用程序,一切正常,直到我进行了数据迁移,将数据迁移到由 Django 迁移创建的数据库中,我使用 SQL 脚本和 Pgadmin 进行了数据迁移。
现在,虽然数据库中已经有了记录,但当我尝试使用 Django 表单添加新记录时,出现以下错误:
“duplicate key value violates unique constraint > "learningcenters_partnerorganization_pkey" DETAIL: Key (id)=(1) already exists.”
应该注意的是,此表的可用 id 为 10。
模型:
class SLPAcademicRound(models.Model):
    name = models.CharField(max_length=45,
                            unique=True,
                            verbose_name=_('Academic Round Name'))
    code = models.CharField(max_length=5,
                            unique=True,
                            verbose_name=_('Code'))
    cycle = models.ForeignKey(
        SLPCycle,
        blank=False, null=True,
        verbose_name=_('SLP Cycle/SLP Cycle'),
        on_delete=models.CASCADE,
    )

    learning_center = models.ForeignKey(
        LearningCenter,
        blank=False, null=True,
        verbose_name=_('Learning Center'),
        on_delete=models.CASCADE,
    )

    round_date_start = models.DateField(
        blank=True,
        null=True,
        verbose_name=_('SLP Round Start Date')
    )
    round_date_end = models.DateField(
        blank=True,
        null=True,
        verbose_name=_('SLP Round End Date')
    )
    current_round = models.BooleanField(
        blank=True,
        null=True,
        verbose_name=_('Current Round')
    )

视图:

class AddSLPAcademicRoundView(LoginRequiredMixin,
              GroupRequiredMixin,
              CreateView):

    template_name = 'bootstrap4/common_form.html'
    form_class = SLPAcademicRoundForm
    queryset= SLPAcademicRound.objects.all()
    group_required = ["LearningCenterManager"]


    def get_absolute_url(self):
        return reverse("slp:slp_academic_round_list")


    def form_valid(self, form):
        print((form.cleaned_data))
        form.save(self.request)
        return super(AddSLPAcademicRoundView, self).form_valid(form)

    def get_form_kwargs(self, *args, **kwargs):
        kwargs = super().get_form_kwargs(*args, **kwargs)
        kwargs['user'] = self.request.user
        return kwargs
2个回答

5

我发现可以使用pg_get_serial_sequence来解决问题,避免对序列作出任何错误的假设。这将在一次操作中重置序列:

SELECT pg_catalog.setval(pg_get_serial_sequence('table_name', 'id'), (SELECT MAX(id) FROM table_name)+1);


0

运行命令

manage.py sqlsequencereset

这将为您提供一个重置表ID的脚本。然后,在psql中运行该脚本,所有表的序列将被重置。


我已经尝试了你的建议,但它似乎将ID重置为1,我想让ID与数据库中已存在的ID同步,以便它可以继续序列。有什么建议吗? - Salma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接