使用Django(Queryset)计算一年中的天数-Postgres

时间:2019-05-21 05:18:47

标签: python django postgresql django-queryset

我正在尝试找出如何计算数据库中一年中的总期间数。例如,计算一年中的总叶子。

我正在使用:

Django - 1.11.7
Postgres - 9.4

这是我的模型。py:

class Leave(models.Model):
    leavedatefrom = models.DateField()
    leavedateto = models.DateField()

说明问题的示例:

leaves taken in 1 year (01/01/2019 - 31/12/2019)

record 1: (leavedatefrom)01/02/2019 - (leavedateto)05/02/2019 ===> 5 days
record 2: (leavedatefrom)10/05/2019 - (leavedateto)12/05/2019 ===> 3 days

Total days = 5 + 3 = 8 days

如何在Django中计算一年中数据库中的天数?基本上我想在上面的示例中得到8天。

3 个答案:

答案 0 :(得分:3)

我觉得我来晚了。您可以通过一个SQL查询获得总天数

from django.db.models import F, IntegerField, ExpressionWrapper, Sum

Leave.objects.filter(...).annotate(
    diff_date_in_integer=ExpressionWrapper(F('leavedateto') - F('leavedatefrom'), output_field=IntegerField())
).annotate(
    diff_date_in_days=ExpressionWrapper(F('diff_date_in_integer') / (1000000 * 60 * 60 * 24), output_field=IntegerField())).aggregate(
    sum=Sum('diff_date_in_days'))

filter(...) 子句中,您可以添加过滤条件,例如datetime user specific data


说明

  1. “整数” 中注释 leavedateto leavedatefrom 之间的区别格式(在diff_date_in_integer带注释的字段中)
  2. 已将 diff_date_in_integer 数据转换为 days
  3. 使用 aggregate() 函数和 Sum() DB函数,我们可以找到总天数。

答案 1 :(得分:0)

以下是获取期间列表的幼稚方法。

从系统中获取所有请假记录,并为每条记录找出天数。

leaves = Leave.objects.filter(leavedatefrom__gte=datetime.date(2019, 1, 1), leavedateto__lte=datetime.date(2019, 12, 31

for leave in leaves:
    days = (leave.leavedatefrom.date() - leave. leavedateto.date()).days()
    period_list.append(days)
total_leaves = sum(period_list)

答案 2 :(得分:0)

基本上,您可以使用gtelte django查询进行查询以获取一年中所有相关的叶子。 例如:

import datetime
leaves = Leave.objects.filter(
    leavedatefrom__gte=datetime.date(2019, 1, 1),
    leavedateto__lte=datetime.date(2019, 12, 31)
)

然后遍历所有叶子并计算它们之间的天差,并将其求和成另一个变量:

total_days = 0
for leave in leaves:
    total_days += (leave.leavedateto - leave.leavedatefrom).days
print total_days

有关计算日期范围的更多详细信息和选项,请参见How to calculate number of days between two given dates?

编辑: 如果您不想每次迭代都访问数据库,可以进行的一种优化是使用django values_list()

leaves = Leave.objects.filter(
    leavedatefrom__gte=datetime.date(2019, 1, 1),
    leavedateto__lte=datetime.date(2019, 12, 31)
).values_list('leavedatefrom', 'leavedateto')

total_days = 0
for leavedateto, leavedatefrom in leaves:
    total_days += (leavedateto - leavedatefrom).days
print total_days