Django Ошибка добавления новой записи. Повторяющееся значение ключа нарушает уникальное ограничение "" Django Идентификатор не синхронизируется c с базой данных. - PullRequest
0 голосов
/ 15 апреля 2020

Я разработал приложение Django, и оно работало правильно, , пока я не сделал миграцию данных в базу данных, созданную путем миграции django, я перенес данные с помощью сценария sql и Pgadmin .

Теперь у меня есть база данных, заполненная записями, но когда я пытаюсь добавить новую запись, используя форму django, я получаю следующее сообщение об ошибке:

значение дублированного ключа нарушает ограничение уникальности > "learningcenters_partnerorganization_pkey" ДЕТАЛИ: Ключ (id) = (1) уже существует.

, учитывая, что доступный идентификатор для этой таблицы равен 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 ]

0 голосов
/ 16 апреля 2020

Я нашел решение с помощью pg_get_serial_sequence, которое можно использовать, чтобы избежать каких-либо неправильных предположений о последовательности. Это сбрасывает последовательность в одном кадре:

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

0 голосов
/ 15 апреля 2020

Запустите команду

manage.py sqlsequencereset

Это даст вам скрипт для сброса идентификаторов таблиц до нормальных. После этого запустите скрипт в psql и все последовательности таблицы будут сброшены.

...