У объекта datetime.date нет атрибута «days» при использовании timedelta - PullRequest
0 голосов
/ 25 сентября 2019

Здесь я пишу метод свойства для отображения оставшихся дней отпуска и общего количества дней отпуска. Общие дни отпуска работают нормально, но def leave_remaining_days(self) это не работает.Я получаю эту ошибку

У объекта 'datetime.date' нет атрибута 'days'

Здесь возникает проблема при возврате дней без чисел return leave_remaining.days, но когдая возвращаю return leave_remaining только тогда это работает.

Как я могу рассчитать оставшиеся дни отпуска здесь?

Только если leave.is_accepted True, тогда я хочу рассчитать оставшиеся дни.

Я хочу уменьшить количество дней 1 до end_day каждый день до

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

РЕДАКТИРОВАТЬ: Дляэто я использовал сельдерей, но это также не работает. Первоначально, чтобы проверить, работает ли оно, я установил минут = 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

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Я думаю, что наиболее очевидным ответом было бы определение вашей leave_remaining_days опоры следующим образом:

@property
def leave_remaining_days(self):
    if self.is_accepted:
        return self.leave_days - 1

не так ли?

0 голосов
/ 25 сентября 2019

Если я правильно понимаю ваш вопрос, то в вашем коде:

leave_remaining = self.end_day - datetime.timedelta(days=1)
return leave_remaining.days

leave_remaining - это datetime.date, то есть за 1 день до self.end_day, что, я думаю, то, что вы хотите;просто верните дату прямо так:

return leave_remaining
...