РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
167 of 818 menu

Сигнал 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,
    который сохраняет объект в базу данных
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить