Как сделать так, чтобы при сохранении данных в базе данных данные, сгенерированные функцией, автоматически вставлялись в поле Django ORM

Я пишу сайт на Django и столкнулся с проблемой

У меня в базе данных есть поле title, в котором хранится название книги, но я хочу добавить поле chunk_title, в котором будет храниться название книги, разделенное на фрагменты по 3 символа, я написал метод, который это делает, но мне нужно, чтобы при вставке в базу данных, он автоматически применялся и его результат вставлялся в chunk_title

Это моя модель БД, где последнее поле - это поле, в которое я хочу автогенерировать значение:

class Book(models.Model):
    """
    Клас,який зберігає всі книги на сайті
    """

    title = models.CharField(max_length=120, default=' ', verbose_name='Назва')
    description = models.TextField(verbose_name='Опис')
    category = models.ForeignKey(Category, on_delete=models.CASCADE, verbose_name='Категорія')
    date_at = models.DateField(auto_now_add=True, verbose_name='Дата створення')
    image = models.ImageField(upload_to='photos/%Y/%m/%d/')
    authors = models.ManyToManyField(Author, verbose_name='Автори')
    content = models.FileField(upload_to='contents/%Y/%m/%d/', blank=True)
    price = models.IntegerField(verbose_name='Ціна', default='0')
    chunk_title_book = models.TextField(default=' ')

А это мой метод, результат которого я хочу вставить в это поле (он находится в том же классе, т.е. Book):

    def chunk_title(self, string: str) -> str:
        """
        Розбиває назву книги на чанки по 3 символи макисмум для подальшого пошуку по цих чанках
        """
        chunk_string = ' '.join(textwrap.wrap(string, 3))
        return chunk_string + ' ' + ' '.join(string.split())

Кто-нибудь знает, возможно ли это реализовать, и если да, то как?

Вам нужно переписать метод save в django Model, и присвоить значение chunk_title_book, вызвав функцию:

class Book(models.Model):
    """
    Клас,який зберігає всі книги на сайті
    """
    .
    .
    .
    .
    def save(self, *args, **kwargs):
        # overwriting `chunk_title_book` attribute 
        # Assumes chunk_title function is Book class's method
        self.chunk_title_book = self.chunk_title(self.title)
        super(Book, self).save(*args, **kwargs)
Вернуться на верх