Django的工作日

时间:2013-07-24 19:07:57

标签: django date django-models

我需要实现一个使用工作日的条件中断。我有一个DateField的课程,如果该日期将来不到5个工作日,则会发生一些事情(操作a),否则会发生b。如何确定两个对象之间的工作日数?

显然,我需要计算从今天开始的5个工作日。使用简单的时间增量可以很容易地找到未来5天,但考虑到工作日,它会变得更加复杂。我想我现在可以安全地忽略假期(这不是最好的情况,但我认为我可以在星期一至星期五的工作日内到期)。任何人都可以给我一些指导,说明我可以做些什么:target = today + 5 business_days

由于

2 个答案:

答案 0 :(得分:2)

这是一个通用的解决方案,即使你的案例很简单; P

from datetime import timedelta, date

def add_business_days(from_date, number_of_days):
    to_date = from_date
    while number_of_days:
       to_date += timedelta(1)
       if to_date.weekday() < 5: # i.e. is not saturday or sunday
           number_of_days -= 1
    return to_date

结果。

>>> date.today()
datetime.date(2013, 7, 25)
>>> add_business_days(date.today(), 6)
datetime.date(2013, 8, 2)

如果您在if语句中检查日期是否属于假日,则会获得奖励。

答案 1 :(得分:0)

此示例是指您将django项目作为API

使用NumpySCIPY可以获得工作日(查看详情) 您必须通过// this is caleld after AuthenticationTokenProvider.Receive public override Task GrantRefreshToken(OAuthGrantRefreshTokenContext context) { base.GrantRefreshToken(context); if (UserLocked(context.Ticket.Identity)) { context.Rejected(); context.SetError("invalid_grant", "User is locked", "usr-lockout"); } }

安装numpy Python 2.7

pip

Python 3

pip install numpy

pip3 install numpy添加,具体取决于您要将属性方法放在何处:

models.py

然后在你的class WorkingDay(models.Model): # YY-MM-DD start = models.DateField(null=True, verbose_name="start") end = models.DateField(null=True, verbose_name="end") @property def workdays(self): total = np.busday_count(self.start, self.end) return total 中你可能有类似的东西。

serializers.py

在你的观点中你可能会做这样的事情。

class WorkingDaySerializer(serializers.ModelSerializer):

    workdays = serializers.IntegerField(read_only=True)

    class Meta:
        model = WorkingDay
        fields = '__all__'
        read_only_fields = ['workdays']