Сигнал post_save
Сигнал post_save активируется сразу после того, как метод save модели завершил свою работу и объект был записан в базу данных. Этот сигнал принимает аргументы: отправитель (класс модели), экземпляр модели, флаг created (указывает, был ли объект создан заново), а также дополнительные параметры через kwargs. Сигнал удобно использовать для автоматических действий: отправка уведомлений, создание связанных объектов, обновление кеша или логирование изменений.
Синтаксис
from 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 с полями заголовка и даты публикации, а также сигнал, который автоматически устанавливает дату публикации при первом сохранении:
from 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()
Теперь при создании новой статьи дата публикации будет проставлена автоматически:
article = Article.objects.create(title="Новая статья")
print(article.published_at)
Результат выполнения кода:
"2026-09-05 12:34:56.789012+00:00"
Пример
Рассмотрим случай, когда при обновлении статьи нужно отправлять уведомление администратору. Для этого используем флаг created и проверяем, изменилось ли поле статуса:
from 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}' опубликована")
При сохранении статьи с изменением статуса на опубликованный сработает сигнал:
article = Article.objects.get(id=1)
article.status = "published"
article.save()
Результат выполнения кода:
"Статья 'Как использовать сигналы' опубликована"
Пример
Использование сигнала для создания профиля пользователя при регистрации. Модель UserProfile связана через OneToOneField с моделью пользователя:
from 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()
Теперь при создании нового пользователя автоматически создаётся связанный профиль:
user = User.objects.create(username="john_doe")
print(user.userprofile)
Результат выполнения кода:
"UserProfile object (1)"
Смотрите также
-
сигнал
pre_save,
который срабатывает до сохранения объекта -
сигнал
post_delete,
который активируется после удаления объекта -
сигнал
m2m_changed,
который отправляется при изменении связей ManyToMany -
метод
save,
который сохраняет объект в базу данных