Сигнал post_save

Сигнал post_save активируется сразу после того, как метод save модели завершил свою работу и объект был записан в базу данных. Этот сигнал принимает аргументы: отправитель (класс модели), экземпляр модели, флаг created (указывает, был ли объект создан заново), а также дополнительные параметры через kwargs. Сигнал удобно использовать для автоматических действий: отправка уведомлений, создание связанных объектов, обновление кеша или логирование изменений.

Синтаксис

pythonfrom django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=MyModel)
def my_handler(sender, instance, created, **kwargs):
  if created:
    # объект только что создан
    pass
  else:
    # объект обновлён
    pass

Пример

Создадим модель Article с полями заголовка и даты публикации, а также сигнал, который автоматически устанавливает дату публикации при первом сохранении:

pythonfrom django.db import models
from django.utils import timezone
from django.db.models.signals import post_save
from django.dispatch import receiver

class Article(models.Model):
  title = models.CharField(max_length=100)
  published_at = models.DateTimeField(blank=True, null=True)

@receiver(post_save, sender=Article)
def set_published_date(sender, instance, created, **kwargs):
  if created and not instance.published_at:
    instance.published_at = timezone.now()
    instance.save()

Теперь при создании новой статьи дата публикации будет проставлена автоматически:

pythonarticle = Article.objects.create(title="Новая статья")
print(article.published_at)

Результат выполнения кода:

python"2026-09-05 12:34:56.789012+00:00"

Пример

Рассмотрим случай, когда при обновлении статьи нужно отправлять уведомление администратору. Для этого используем флаг created и проверяем, изменилось ли поле статуса:

pythonfrom django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver

class Article(models.Model):
  title = models.CharField(max_length=100)
  status = models.CharField(max_length=20, default="draft")

@receiver(post_save, sender=Article)
def notify_on_publish(sender, instance, created, **kwargs):
  if not created and instance.status == "published":
    print(f"Статья '{instance.title}' опубликована")

При сохранении статьи с изменением статуса на опубликованный сработает сигнал:

pythonarticle = Article.objects.get(id=1)
article.status = "published"
article.save()

Результат выполнения кода:

python"Статья 'Как использовать сигналы' опубликована"

Пример

Использование сигнала для создания профиля пользователя при регистрации. Модель UserProfile связана через OneToOneField с моделью пользователя:

pythonfrom django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver

class UserProfile(models.Model):
  user = models.OneToOneField(User, on_delete=models.CASCADE)
  bio = models.TextField(blank=True)

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
  if created:
    UserProfile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
  instance.userprofile.save()

Теперь при создании нового пользователя автоматически создаётся связанный профиль:

pythonuser = User.objects.create(username="john_doe")
print(user.userprofile)

Результат выполнения кода:

python"UserProfile object (1)"

Смотрите также

  • сигнал pre_save,
    который срабатывает до сохранения объекта
  • сигнал post_delete,
    который активируется после удаления объекта
  • сигнал m2m_changed,
    который отправляется при изменении связей ManyToMany
  • метод save,
    который сохраняет объект в базу данных