Django выбрасывает ошибку "Дублирование значения ключа нарушает ограничение уникальности".

Я изучаю фреймворк Django, и в нем есть упражнение, в котором предлагается создать простое веб-приложение для блога. Это приложение имеет простые модели и формы для обработки данных, которые теоретический пользователь будет сохранять в базе данных проекта.

Вот модели:

from django.db import models


class Blog(models.Model):
    text = models.TextField()
    date_added = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.text

class Post(models.Model):
    blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
    text = models.TextField()
    date_added = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.text

Вот формы:

from django import forms
from . models import Blog, Post


class BlogForm(forms.ModelForm):
    class Meta:
        model = Blog
        fields = ['text']
        labels = {'text': ''}

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ['text']
        labels = {'text': ''}

Допустим, я добавляю экземпляр Blog через db. Вот как я это делаю:

INSERT INTO learning_logs_topic (id, text, date_added)
VALUES
(1, 'A blog #1', now()::timestamptz);

Эти данные появляются на сайте админки Django и в html-шаблоне. Это происходит практически мгновенно, что означает, что Django действительно знает о том, что новая дата была добавлена в базу данных. Но когда я пытаюсь добавить экземпляр блога через админку или через сохранение html-формы, Django выкидывает ошибку. Вот я добавляю экземпляр блога с идентификатором 21:

INSERT INTO blogs_blog (id, text, date_added)
VALUES
(21, 'test21', now()::timestamptz);

И я получаю эту ошибку: IntegrityError at /add_new_blog/

duplicate key value violates unique constraint "blogs_blog_pkey"
DETAIL:  Key (id)=(21) already exists.

Не совсем понимаю, что здесь происходит. Django получает данные из базы данных и отправляет их в браузер, но не "видит" ID при попытке записать данные в базу данных.

Я думаю, что каким-то образом мне нужно заставить Django увидеть этот последний ID в базе данных.

Не совсем понятно, что здесь происходит. Django получает данные из БД и отправляет их в браузер, но не "видит" ID при попытке записать данные в БД.

Django does not generate ids, that is done by the database itself. In the case of PostgreSQL normally by a sequence [pgsql-doc]. If you manually add a record with an id (which is typically a very bad idea), the sequence will not update.

Этот ответ показывает, как можно обновить последовательность так, чтобы с этого момента она генерировала последовательности, начинающиеся с 22 (в данном случае).

Но я бы посоветовал не указывать первичный ключ в первую очередь, когда вы вставляете значение. Обычно вы должны рассматривать первичный ключ как "значение черного ящика". Да, по техническим причинам здесь это int, но, например, не имеет смысла складывать два первичных ключа вместе, так что это просто деталь реализации.

Вернуться на верх