Django 添加新记录报错duplicate key value violates unique constraint "" Django Id doesn't sync with database
Django Add new record error duplicate key value violates unique constraint "" Django Id doesn't sync with database
我开发了一个 Django 应用程序并且它工作正常,直到我对 django 迁移创建的数据库进行了数据迁移,我使用 sql 脚本和 Pgadmin。
现在我的数据库中充满了记录,但是当我尝试使用 Django 表单添加新记录时,出现以下错误:
duplicate key value violates unique constraint > "learningcenters_partnerorganization_pkey"
DETAIL: Key (id)=(1) already exists.
考虑到此 table 的可用 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
运行 命令
manage.py sqlsequencereset
这将为您提供一个脚本,用于将 table ID 重置为正常。
此后,运行 psql 中的脚本和所有 table 的序列将被重置。
我发现 pg_get_serial_sequence 的解决方案可用于避免对序列的任何不正确假设。这会一次性重置序列:
SELECT pg_catalog.setval(pg_get_serial_sequence('table_name', 'id'), (SELECT MAX(id) FROM table_name)+1);
我开发了一个 Django 应用程序并且它工作正常,直到我对 django 迁移创建的数据库进行了数据迁移,我使用 sql 脚本和 Pgadmin。
现在我的数据库中充满了记录,但是当我尝试使用 Django 表单添加新记录时,出现以下错误:
duplicate key value violates unique constraint > "learningcenters_partnerorganization_pkey" DETAIL: Key (id)=(1) already exists.
考虑到此 table 的可用 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
运行 命令
manage.py sqlsequencereset
这将为您提供一个脚本,用于将 table ID 重置为正常。 此后,运行 psql 中的脚本和所有 table 的序列将被重置。
我发现 pg_get_serial_sequence 的解决方案可用于避免对序列的任何不正确假设。这会一次性重置序列:
SELECT pg_catalog.setval(pg_get_serial_sequence('table_name', 'id'), (SELECT MAX(id) FROM table_name)+1);