Skip to content

2.4.1 Сигналы

Задание 2.4.1

Реализовать 3 сигнала, которые:

  • Вызывает логику, во время создания экземаляра объекта.
  • Сохраняет значения выбранных полей в таблице в специальные поля для хранения предыдущих значений при обновлении объекта.
  • При удалении объекта записывает информацию об удалении в лог реализованный любым образом.

Для регистрации сигналов добавим конфигурацию ready в apps.py:

class MainConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'main'

    def ready(self):
        from . import signals

Сигнал 1: создание участника:

@receiver(post_save, sender=Participant)
def create_participant(sender, instance, created, **kwargs):
    if created:
        print(f'Participant {instance.name} created\n')

Сигнал 2: обновление данных о вакцинации:

В модель участника добавлено поле previous_vaccination

@receiver(pre_save, sender=Participant)
def update_participant_vaccination(sender, instance, **kwargs):
    prev_instance = Participant.objects.get(id=instance.id)
    instance.previous_vaccination = prev_instance.vaccinated
    print(f'Vaccination info for {instance.name} updated: \n'
          f'was: {instance.previous_vaccination}\n'
          f'now: {instance.vaccinated}\n')

Если поменять дату еще раз:

Сигнал 3: удаление участника и логирование:

@receiver(pre_delete, sender=Participant)
def delete_participant(sender, instance, **kwargs):
    with open('deleted_participants_log.txt', 'a') as f:
        f.write(f'Participant {instance.name} deleted\n')