Ответ
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
. Использование сигналов позволяет отделить эту логику от самого класса модели.