Не обязательно легкий, но когда я столкнулся с этой проблемой, у меня было два решения.
Для начала я написал менеджер Django, который будет создавать набор запросов объектов, срок действия которых истек, а затем удалять их. Чтобы сделать это легче, я сохранил объекты «срок действия истекает» в их собственной таблице с отношением один к одному с фактическими объектами, и удалил эти события, которые они сделали, чтобы сохранить это столик маленький. Связь между объектом «истекает» и объектом, помеченным как «истек», вызывает попадание базы данных во вторую таблицу только тогда, когда вы разыменовываете поле ForeignKey, поэтому оно довольно легкое. Затем я буду вызывать этот управленческий вызов каждые 5 минут с помощью cron (диспетчер расписаний для Unix, если вы не знакомы с Unix). Это было нормально для каждого часа или около того.
Для более близких к второму тайм-аутам мое решение состояло в том, чтобы запустить отдельный сервер, который через вызовы REST из приложения Django получает уведомления о тайм-аутах. Он хранит отсортированный список того, когда должны были произойти таймауты, а затем вызывает вышеупомянутый управленческий вызов. Это в основном собственный планировщик с запланированными событиями, передаваемыми ему процессом Django. Чтобы сделать это дешево, я написал это с помощью Node.js.
Оба они работали. Работа cron намного проще.