【问题标题】:Delete an object automatically after 5 minutes5分钟后自动删除对象
【发布时间】:2019-12-07 14:55:04
【问题描述】:

我正在尝试创建一个在发布 5 分钟后自动删除对象的函数。

from django.contrib.gis.db import models
from django.utils import timezone

import datetime

class Event(models.Model):
    name = models.CharField(
        max_length=100,
        )
    publishing_date = models.DateTimeField(
    default=timezone.now,
    blank=True,
    )

    @property
    def delete_after_five_minutes(self):
        time = self.publishing_date + datetime.timedelta(minutes=5)
        if time > datetime.datetime.now():
            e = Event.objects.get(pk=self.pk)
            e.delete()
            return True
        else:
            return False

问题是所有对象都被删除了,而不仅仅是我想要的对象。

【问题讨论】:

  • 你应该换成比较,所以time < datetime.datetime.now()

标签: python-3.x django-models django-2.2


【解决方案1】:

你应该交换比较,所以:

if time < datetime.datetime.now():
    # ...

或许更易读:

if self.publishing_date < datetime.datetime.now()-datetime.timedelta(minutes=5):
    # ...

因为这意味着 现在之前 5 分钟仍然在 Event 的发布时间之后。

话虽如此,最好不要删除这些值,或者至少不要立即删除,而是创建一个简单地“隐藏”这些对象的管理器。然后,您可以稍后定期删除这些元素。

我们可以让这样的经理:

from django.utils import timezone

class EventManager(models.Manager):

    def get_queryset(self):
        return super().get_queryset().filter(
            publishing_date__gte=timezone.now()-timezone.timedelta(minutes=5)
        )

然后像这样使用这个管理器:

class Event(models.Model):
    # ...
    objects = EventManager()

那么Event.objects 将只检索不到五分钟前发布的Events。

您可以通过以下方式定期删除此类事件:

Event._base_manager.filter(
    publishing_date__lt=timezone.now()-timezone.timedelta(minutes=5)
).delete()

这将“批量”删除这些Events。

【讨论】:

  • 哦,太好了,它运行了!我不知道可以使用EventManager 之类的东西“将对象置于待机状态”。我必须提高我的 Python 和 Django 技能。谢谢你:)
  • @MassimilianoMoraca:还有一个 django-softdelete 可能/可能无济于事的软件包:github.com/scoursen/django-softdelete
  • 请注意,在默认管理器中过滤基本查询集要谨慎,参见docs.djangoproject.com/en/2.2/topics/db/managers/…
  • @brunodesthuilliers:我同意。可能最好使用像 softdelete 这样的包,因为这样就可以为经理使用像 .active_objects.all_objects 这样的名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 2019-10-09
  • 1970-01-01
相关资源
最近更新 更多