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]
Простой способ:
- Создайте команду Django. Ссылка: https://docs.djangoproject.com/en/4.1/howto/custom-management-commands/ .
- Пример: 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()
- Напишите оболочку bash для выполнения этой команды.
start.sh
#!/bin/bash
cd your-project-path
python manage.py check_user_inactive
- Настройте 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