Для чего используется сигнал pre_save в Django

Ответ

pre_save — это сигнал в Django, который отправляется непосредственно перед сохранением экземпляра модели в базе данных (до вызова метода .save()).

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

Основные сценарии использования:

  • Генерация слагов (slugs): Создание URL-совместимой строки из заголовка.
  • Обновление полей: Автоматическое обновление поля updated_at при каждом изменении.
  • Валидация: Выполнение сложной проверки данных, зависящей от состояния других полей.

Пример: Автоматическое создание слага

from django.db import models
from django.db.models.signals import pre_save
from django.dispatch import receiver
from django.utils.text import slugify

class Article(models.Model):
    title = models.CharField(max_length=200)
    slug = models.SlugField(max_length=200, blank=True, unique=True)

# Декоратор @receiver связывает функцию с сигналом
@receiver(pre_save, sender=Article)
def create_article_slug(sender, instance, **kwargs):
    """Генерирует слаг, только если он еще не задан."""
    if not instance.slug:
        instance.slug = slugify(instance.title)

В этом примере функция create_article_slug будет вызвана каждый раз перед сохранением объекта Article. Она проверит, пуст ли slug, и если да, сгенерирует его из поля title. Использование сигналов позволяет отделить эту логику от самого класса модели.