gpt4 book ai didi

python - 如何在 Django 中创建特定时间后删除记录?

转载 作者:行者123 更新时间:2023-12-02 18:59:48 24 4
gpt4 key购买 nike

我正在构建一个具有“故事功能”的应用程序,它与 Instagram 的故事功能非常相似,所以我想在故事创建 24 小时后删除它。因此,如果一个故事是在 2021 年 1 月 1 日中午 12:00 创建的,我想在 2021 年 1 月 2 日中午 12:00 自动删除它。我使用的是 django3.1

我的模型:

class Story(models.Model):
user = models.ForeignKey(to=User, on_delete=models.CASCADE)
text = models.CharField(max_length=200)
image = models.ImageField(blank=True, null=True)
video = models.FielField(blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
expiration_time = models.DateTimeField()

我想在特定过期时间后删除每条记录。

[过期时间在post_save函数中设置]

最佳答案

执行此操作的最可靠方法通常是结合使用过滤和删除项目以及您每小时/每天/每周运行的任务。

因此,我们可以检索尚未过期的项目:

from django.db.models.functions import Now

stories = Story.objects.filter(<b>expiration_time__lt=Now()</b>)

如果您需要经常过滤,制作一个 manager [Django-doc] 可能会更有趣为此。

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

class <b>StoryManager</b>(models.Manager):

def get_queryset(self, *args, **kwargs):
return super().get_queryset(*args, **kwargs).<b>filter(</b>
expiration_time__lt=Now()
<b>)</b>


class Story(models.Model):
# …
xpiration_time = models.DateTimeField(<b>db_index=True</b>)

objects = <b>StoryManager()</b>

db_index=True part [Django-doc]通常会提高过滤过期对象的性能。

当然,这不会删除元素,它只是不会检索这些元素(因此,如果您在 View 中过滤这些元素,那么您将看不到这些元素)。

您可以创建一个周期性任务,例如 cronjob [wiki]它将每天、每周、每月、每小时运行以删除元素。您可以通过定义 management command [Django-doc] 来做到这一点:

# <i>app_name</i>/management/commands/remove_expired_stories.py

from django.core.management.base import BaseCommand
from django.db.models.functions import Now

from <i>app_name</i>.models import Story

class Command(BaseCommand):
help = 'Remove expired stories'

def handle(self, *args, **options):
Story._base_manager.filter(<b>expiration_time__gte=Now()</b>)<b>.delete()</b>

然后就可以手动运行了:

python3 manage.py <b>remove_expired_stories</b>

或者您可以安排此任务定期运行。这更健壮:如果由于某种原因调度程序不再工作,那么过滤仍然会阻止您看到过期的 Story。它也比为每个故事安排一个过期脚本更简单、更有效,特别是因为如果过期时间稍后发生变化,删除计划的项目并重新安排这些项目将非常复杂。

关于python - 如何在 Django 中创建特定时间后删除记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65718886/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com