Django ORM计算两个日期属性之间的天数

A.J*_*.J. 6 python django django-orm

情境

我有一张桌子student。它具有以下属性

name

age

school_passout_date

college_start_date

我需要一份报告,以了解avg number of days在通过学校和开始大学学习之间,学生可以获得什么自由。

目前的方法

目前,我正在为每个学生寻找天数并获取其平均值的价值范围感到恼怒。

问题

当记录集变大时,效率极低。

Django ORM中有什么功能可以给我两个日期之间的总计天数?

可能性

我正在寻找这样的东西。

Students.objects.filter(school_passed=True, started_college=True).annotate(total_days_between=Count('school_passout_date', 'college_start_date'), Avg_days=Avg('school_passout_date', 'college_start_date'))
Run Code Online (Sandbox Code Playgroud)

最好,

Aid*_*dan 5

你可以这样做:

Model.objects.annotate(age=Cast(ExtractDay(TruncDate(Now()) - TruncDate(F('created'))), IntegerField()))
Run Code Online (Sandbox Code Playgroud)

这使您可以使用整数值,例如,您可以执行以下操作:

from django.db.models import IntegerField, F
from django.db.models.functions import Cast, ExtractDay, TruncDate

qs = (
    Model
    .objects
    .annotate(age=Cast(ExtractDay(TruncDate(Now()) - TruncDate(F('created'))), IntegerField()))
    .annotate(age_bucket=Case(
        When(age__lt=30, then=Value('new')),
        When(age__lt=60, then=Value('current')),
        default=Value('aged'),
        output_field=CharField(),
    ))
)
Run Code Online (Sandbox Code Playgroud)


Spo*_*k16 1

Django 目前只接受 4 个函数的聚合:Max、Min、Count 等 Average,所以这做起来有点棘手。

那么解决方案就是使用extra方法。那样:

Students.objects.
    extra(select={'difference': 'school_passout_date' - 'college_start_date'}).
    filter('school_passed=True, started_college=True)
Run Code Online (Sandbox Code Playgroud)

但是,你仍然需要在服务器端进行平均