在这里,我正在编写属性方法来显示剩余休假天数和总休假天数。总休假天数正常,但def leave_remaining_days(self)
这是行不通的。 我去这个错误
datetime.date"对象没有属性"days">
这里的问题是在返回天数时return leave_remaining.days
但是当我返回时return leave_remaining
它就可以工作了。
我如何计算剩余的休假天数?
只有当leave.is_accepted
为真时,我才想计算剩余天数。
我想每天减少1
end_day
的天数,直到
datetime.date.today() == self.end_day
.
编辑:为此我使用了芹菜,但这也不起作用。最初为了检查它是否有效,我在定期任务中设置了 minutes=1,但它不起作用。
models.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
您收到此错误的原因是,从date
中减去timedelta
会导致date
。
date
没有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_day
和end_day
我不确定您是否需要每天减少任何东西。你也许可以检查我上面写的属性。
如果我正确理解您的问题,那么在您的代码中:
leave_remaining = self.end_day - datetime.timedelta(days=1)
return leave_remaining.days
leave_remaining
是self.end_day
前 1 天的datetime.date
,我认为这就是您想要的; 只需像这样直接返回日期:
return leave_remaining
我认为最明显的答案是像这样定义你的leave_remaining_days
道具:
@property
def leave_remaining_days(self):
if self.is_accepted:
return self.leave_days - 1
不是吗?
你是这个意思吗?
@property
def leave_remaining_days(self):
if self.is_accepted and not datetime.date.today() > self.end_day:
leave_remaining = self.end_day - datetime.date.today()
return leave_remaining.days
这将起作用:
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.day
leave_remaining。一天会给你剩余的休假天数