首页 > 解决方案 > 'datetime.date' 对象在使用 timedelta 时没有属性 'days' 错误

问题描述

在这里,我正在编写属性方法来显示剩余休假天数和总休假天数。总休假天数工作正常,但这def leave_remaining_days(self)不起作用。我去这个错误

'datetime.date' 对象没有属性 'days'

这里的问题是在返回天数return leave_remaining.days时,但是当我返回时return leave_remaining它就可以工作。

我如何计算这里的剩余休假天数?

只有当leave.is_acceptedTrue 时,我才想计算剩余天数。

我想每天减少天数,1直到end_day

datetime.date.today() == self.end_day.

编辑:为此,我使用了芹菜,但这也不起作用。最初检查它是否有效,我在周期性任务中设置了 minutes=1 但它不起作用。

模型.py

class Leave(models.Model):
    staff = models.ForeignKey(get_user_model(),on_delete=models.CASCADE,related_name='staff')
    sub = models.CharField(max_length=300)
    msg = models.TextField()
    start_day = models.DateField()
    end_day = models.DateField()
    is_accepted = models.BooleanField(default=False)
    is_rejected = models.BooleanField(default=False)

    @property
    def leave_days(self):
        diff = self.end_day - self.start_day
        return diff.days

    @property
    def leave_remaining_days(self):
        if self.is_accepted and not datetime.date.today() > self.end_day:
            leave_remaining = self.end_day - datetime.timedelta(days=1)
            return leave_remaining.days

#changes
from celery.schedules import crontab
from celery.task import periodic_task
@property
@periodic_task(run_every=crontab(minute=1))
def leave_remaining_day(self):
    if self.is_accepted and not datetime.date.today() > self.end_day:
        leave_remaining = self.leave_days - 1
        return leave_remaining

标签: pythondjangodatetimedjango-modelscelery

解决方案


您收到此错误的原因是timedelta从 a中减去 adate会导致 a date

Adate没有days属性(您可以通过创建一个并调用dir(...)它或查看文档来检查它)。

在旁注中,如果您想leave_remaining_days返回距离结束还有多少天Leave,那么您应该执行以下操作:

@property
    def leave_remaining_days(self):
        if self.is_accepted and not datetime.date.today() > self.end_day:
            delta = self.end_day - datetime.date.today()
            return delta.days

由于您正在存储start_dayend_day我不确定您是否需要每天减少任何内容。您也许可以检查我上面写的属性。


推荐阅读