如何知道活动日期何时过去 - django

Posted

技术标签:

【中文标题】如何知道活动日期何时过去 - django【英文标题】:how to know when an activity date has passed - django 【发布时间】:2022-01-14 02:22:00 【问题描述】:

所以我仍在我的待办事项列表中,我想知道活动何时结束,以便将其标记为过期。

我的意见.py

def progress(request):
    activities = ToDo.objects.all()
    today = timezone.localtime(timezone.now())
    context = 
        'activities' : activities,
        'today' : today, 
    
    return render(request, 'percent.html', context)
    

在我的模板中,我有它:

 % for activity in activities %
    % if activity.end.date < today.date %
    activity <br>
    % endif %
    % endfor %

我要添加我的 models.py 以供参考

class ToDo(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    todo = models.CharField(max_length=50)
    description = models.TextField(max_length=200, blank=True)
    created = models.DateField(auto_now=True)
    end = models.DateField()
    start = models.DateField()
    completed = models.BooleanField(default=False)

    def __str__(self):
        return f'self.owner - self.todo'

或者向我的模型添加过期的布尔字段会更容易吗?我很困惑

【问题讨论】:

【参考方案1】:

注意:你需要使用Celery Beat作为调度器。

import datetime

def expired_activity():
    today = datetime.date.today()
    expired_activity = ToDo.objects.filter(end=today)
    if expired_activity:
            expired_activity.update(completed=True)

【讨论】:

【参考方案2】:

如果您不想使用任何调度程序,您可以使用 ORM 管理器在另一个请求中获取过期项目:

from django.db import models


class ToDoManager(models.Manager):
    def active(self):
        return self.excude(end__lt=today().date)

    def expired(self):
        return self.filter(end__lt=today().date)


class ToDo(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    todo = models.CharField(max_length=50)
    description = models.TextField(max_length=200, blank=True)
    created = models.DateField(auto_now=True)
    end = models.DateField()
    start = models.DateField()
    completed = models.BooleanField(default=False)
    
    objects = ToDoManager()

    def __str__(self):
        return f'self.owner - self.todo'
    

在你看来,你会在不同的请求中得到它们:

ToDo.objects.active()
ToDo.objects.expired()

或者您可以在从 db 请求数据时通过设置过期标志和保存结果来更改管理器

【讨论】:

以上是关于如何知道活动日期何时过去 - django的主要内容,如果未能解决你的问题,请参考以下文章

如何比较 Django 模板中的日期

PHP:如何获取过去某个特定日期的上周日..?

如何防止在 DatePicker JDeveloper 中选择过去的日期?

Django Q 错误查询逻辑

如何检测用户何时尝试滑动“过去的 UIScrollView 内容偏移”?

如何在 GQL 中查询过去 6 小时(日期时间)的所有条目?