Python Django ORM计算两个日期属性之间的天数 脚本
我有一张桌子Python Django ORM计算两个日期属性之间的天数 脚本,python,django,django-orm,Python,Django,Django Orm,我有一张桌子学生。它具有以下属性 名称 年龄 school\u passout\u date college\u start\u date 我需要一份报告来了解学生从通过学校到开始上大学之间的免费天数 当前方法 目前,我对为每个学生寻找天数并获得其平均值的范围感到恼火 问题 当记录集变大时,这是非常低效的 问题: Django ORM中是否有任何能力让我在两个日期之间的总天数 可能性 我在找这样的东西 Students.objects.filter(school_passed=True, sta
学生
。它具有以下属性
名称
年龄
school\u passout\u date
college\u start\u date
我需要一份报告来了解学生从通过学校到开始上大学之间的免费天数
当前方法
目前,我对为每个学生寻找天数并获得其平均值的范围感到恼火
问题
当记录集变大时,这是非常低效的
问题:
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'))
Django目前只接受4个函数的聚合:Max、Min、Count、et Average,所以这有点棘手 然后,解决方法是使用该方法。这样:
Students.objects.
extra(select={'difference': 'school_passout_date' - 'college_start_date'}).
filter('school_passed=True, started_college=True)
但是,您仍然需要在服务器端进行数学平均,根据(预期)的事实,即发送日期始终晚于开始日期,您只需计算所有开始日期和发送日期的平均值,然后进行差异 这给了你一个类似的解决方案
from django.db.models import Avg
avg_start_date = Students.objects.filter(school_passed=True, started_college=True).aggregate(Avg('school_start_date'))
avg_passout_date = Students.objects.filter(school_passed=True, started_college=True).aggregate(Avg('school_passout_date'))
avg_time_at_college = avg_passout_date - avg_start_date
这个问题很老了,但Django ORM现在更高级了 可以使用F()函数来实现这一点
from django.db.models import Avg, F
college_students = Students.objects.filter(school_passed=True, started_college=True)
duration = college_students.annotate(avg_no_of_days=Avg( F('college_start_date') - F('school_passout_date') )
您可以这样做:
Model.objects.annotate(age=Cast(ExtractDay(Now())-TruncDate(F('created'))、IntegerField())
这使您可以处理整数值,例如,您可以执行以下操作:
从django.db.models导入IntegerField,F
从django.db.models.functions导入Cast、ExtractDay、TruncDate
qs=(
模型
.物品
.annotate(age=Cast(ExtractDay(TruncDate(Now())-TruncDate(F('created'))),IntegerField())
.annotate(年龄=大小写)(
当(年龄=30,然后=值('new')时,
当(年龄=60,然后=值(“当前”),
默认值=值('aged'),
输出字段=字符字段(),
))
)
请确定:您想在DB端而不是Django服务器上进行平均计算吗?