你能在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

并且该模型具有过期属性。有没有办法让这个模型在过期后自行删除?

只需制作一个过滤器,即可防止检索过期的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
classVerificationTokenManager(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
fromapp_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-dc]更好。有关更多信息,请参阅文档中引用User模型的部分。

我认为Django没有提供那种功能。您可以使用Celery创建一个Celery任务,该任务将删除在一定时间后过期的令牌。您还可以创建任务,定期查找过期的令牌并将其删除。

芹菜文档

不幸的是,这是不可能的。您可以做的是使用芹菜节拍或您喜欢的东西创建一个cronjob,并设置一个cronjob任务来清理过期的DB记录(每分钟/小时/天一次(

最新更新