Можете ли вы создать объект, который удаляет сам себя в Django?

Так я сделал модель VerificationToken

class VerificationToken(models.Model):

    user = models.ForeignKey(User, on_delete=models.CASCADE)
    code = models.CharField(max_length=4)
    date_created = models.DateTimeField(auto_now_add=True)


    @property
    def expiration(self):

        lifetime = timedelta(minutes=10)

        expire = self.date_created + lifetime

        return expire

и у этой модели есть свойство expiration. Есть ли способ заставить эту модель удалить себя после истечения срока действия?

Я считаю, что Django не предоставляет такой функциональности. Вы можете использовать Celery для создания задачи celery, которая будет удалять токены, срок действия которых истекает через определенное время. Также вы можете создать задачу, которая будет периодически находить просроченные токены и удалять их

Документация по сельдерею

К сожалению, это невозможно. Что вы можете сделать, так это создать cronjob, используя celery-beat или то, что вам нравится, и установить задачу cronjob для очистки просроченных записей БД (раз в минуту/час/день)

Просто сделайте фильтр, который предотвращает получение просроченных VerificationTokens:

from datetime import timedelta
from django.db.models.functions import Now

VerificationToken.objects.filter(
    date_created__gte=Now()-timedelta(minutes=10)
)

Вы также можете создать менеджер, такой, что VerificationToken.objects является менеджером, который содержит только неистекшие токены:

from datetime import timedelta
from django.conf import settings
from django.db.models.functions import Now

class VerificationTokenManager(models.Manager):
    
    def get_queryset(self):
        return super().get_querset().filter(
            date_created__gte=Now()-timedelta(minutes=10)
        )

class VerificationToken(models.Model):
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE
    )
    code = models.CharField(max_length=4)
    date_created = models.DateTimeField(auto_now_add=True, db_index=True)
    objects = VerificationTokenManager()

затем вы можете сделать команду управления [Django-doc], которую вы, например, запускаете через cron, или какую-либо другую задачу планирования, которая удаляет просроченные VerificationToken с:

# app_name/management/commands/remove_expired_tokens.py

from datetime import timedelta
from django.core.management.base import BaseCommand
from django.db.models.functions import Now
from app_name.models import VerificationToken

class Command(BaseCommand):
    help = 'Remove expired verification tokens'

    def handle(self, *args, **options):
        VerificationToken._base_manager.filter(
            date_created__lt=Now()-timedelta(minutes=10)
        ).delete()

Примечание: Обычно лучше использовать settings.AUTH_USER_MODEL [Django-doc] для ссылки на модель пользователя, чем использовать User модель [Django-doc] напрямую. Для получения дополнительной информации вы можете посмотреть ссылка на User модель раздел документации .

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