Могу ли я прервать задачу Celery другой задачей?
В моем проекте есть представление, которое запускает задачу Celery при регистрации пользователя. Задача проверяет, верифицирован ли пользователь через 3 дня после регистрации:
@shared_task()
def delete_user_if_not_verified(user_pk: int):
user = User.objects.get(pk=user_pk)
email = user.email
if not user.is_verified:
user.delete()
return f'Delete {email} user'
Моя идея состоит в том, что эта задача будет прервана другой задачей в случае, если пользователь верифицировался намного раньше, например, сразу после регистрации. Я уже придумал, как отлавливать изменения в базе данных, но я просто не знаю, как я могу передать задачу или id пользователя, который верифицировался, в delete_user_if_not_verified(). Возможно ли это, или эта идея плоха, и я обойдусь одной задачей?
Проще создать периодическую задачу: https://docs.celeryproject.org/en/stable/userguide/periodic-tasks.html
Убедитесь, что вы привели запрос к базе данных в соответствие с вашей моделью. Цель - выбрать всех пользователей, которые зарегистрировались до трех дней назад и неактивны. После этого просто удалите их
@periodic_task(
bind=True,
run_every=(crontab(minute=0, hour=0))
)
def delete_not_registered_users(self):
User.objects.filter(created__lt=datetime.datetime.now() - timedelta(days=3)), is_verified=False).delete()