SQL-триггер внутри модели Django

У меня есть модель User в моем проекте django приложения, и я также создал систему активации электронной почты, так что когда пользователь создает аккаунт, на его почту отправляется сообщение. Внутри этого сообщения есть ссылка с токеном, который имеет срок действия = 1 день. Когда пользователь нажимает на ссылку, поле is_active внутри записи пользователя превращается в true, но если нет, то в базе данных навсегда останется неактивный пользователь

По этой причине мне нужно создать триггер, который удалит запись пользователя через один день, если is_active != true. Как я могу создать такой триггер в модели Django?

class User(AbstractBaseUser, PermissionsMixin):
     ...
     first_name = models.CharField(max_length=150, blank=True)
     last_name = models.CharField(max_length=150, blank=True)
     is_active = models.BooleanField(default=False)
     ...


     def __str__(self):
         return self.email
    
     def __getitem__(self,key):
         return self.__dict__[key]

Простой способ:

  1. Создайте команду Django. Ссылка: https://docs.djangoproject.com/en/4.1/howto/custom-management-commands/
  2. .
  • Пример: check_user_inactive.py
... 
   def handle(self, *args, **options):
      qs = User.objects.filter(active != True)
      qs = qs.filter(...) # include your logic to filter user don't active in 1 day ago. 
      qs.delete()
  1. Напишите оболочку bash для выполнения этой команды. start.sh
#!/bin/bash
cd your-project-path
python manage.py check_user_inactive
  1. Настройте cronjob для выполнения этой команды каждые 5 минут или 15 минут, или 1 час, или в определенное время. Вы можете использовать crontab для этого.
1. sudo chmod +x `start.sh`
2. sudo crontab -e
3. edit file cron > */5 * * * * /your-path/start.sh

Другой профессиональный способ - использовать сельдерей + сельдерей-безе для этого Ссылка: https://docs.celeryq.dev/en/stable/userguide/periodic-tasks.html

Вернуться на верх