5 分钟后自动删除对象
Delete an object automatically after 5 minutes
我正在尝试创建一个在发布 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
问题是所有对象都被删除了,而不仅仅是我想要的对象。
你应该交换比较,所以:
if <b>time < datetime.datetime.now()</b>:
# ...
或者可能更具可读性:
if self.publishing_date < datetime.datetime.now()-datetime.timedelta(minutes=5):
# ...
因为这意味着 现在 之前的五分钟仍然晚于 Event
发布的时间。
话虽这么说,但最好不要删除这些值,或者至少不要立即删除这些值,而是让管理器简单地"hides"这些对象。然后您可以稍后定期删除这些元素。
我们可以通过以下方式创建这样的管理器:
from django.utils import timezone
class <b>EventManager</b>(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(
<b>publishing_date__gte=timezone.now()-timezone.timedelta(minutes=5)</b>
)
然后像这样使用这个管理器:
class Event(models.Model):
# ...
objects = <b>EventManager</b>()
然后 Event.objects
将只检索不到五分钟前发布的 Event
。
您可以定期删除此类事件:
Event._base_manager.filter(
publishing_date__lt=timezone.now()-timezone.timedelta(minutes=5)
).delete()
这将删除 "bulk" 中的这些 Event
。
我正在尝试创建一个在发布 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
问题是所有对象都被删除了,而不仅仅是我想要的对象。
你应该交换比较,所以:
if <b>time < datetime.datetime.now()</b>:
# ...
或者可能更具可读性:
if self.publishing_date < datetime.datetime.now()-datetime.timedelta(minutes=5):
# ...
因为这意味着 现在 之前的五分钟仍然晚于 Event
发布的时间。
话虽这么说,但最好不要删除这些值,或者至少不要立即删除这些值,而是让管理器简单地"hides"这些对象。然后您可以稍后定期删除这些元素。
我们可以通过以下方式创建这样的管理器:
from django.utils import timezone
class <b>EventManager</b>(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(
<b>publishing_date__gte=timezone.now()-timezone.timedelta(minutes=5)</b>
)
然后像这样使用这个管理器:
class Event(models.Model):
# ...
objects = <b>EventManager</b>()
然后 Event.objects
将只检索不到五分钟前发布的 Event
。
您可以定期删除此类事件:
Event._base_manager.filter(
publishing_date__lt=timezone.now()-timezone.timedelta(minutes=5)
).delete()
这将删除 "bulk" 中的这些 Event
。