Можете ли вы создать объект, который удаляет сам себя в 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модель раздел документации .