gpt4 book ai didi

带有日期时间计算的 Django 查询集注释

转载 作者:行者123 更新时间:2023-12-02 03:19:20 24 4
gpt4 key购买 nike

我有一个有两个日期时间的模型,一个是创建日期,另一个是完成日期。

class Task(models.Model):
...
created = models.DateTimeField(default=timezone.now)

STATUS = Choices(
('draft', 'Draft'),
('open', 'Open'),
('wip', 'In Progress'),
('completed', 'Completed'),
)

datetime_started = models.DateTimeField(blank=True, null=True)
datetime_wip = models.DateTimeField(blank=True, null=True)
datetime_completed = models.DateTimeField(blank=True, null=True)
...

我正在尝试注释查询集以计算完成 Task 所需的平均时间.我尝试使用 Django 的 AvgF表达式,但无济于事:
today = timezone.now()
# We display the data of last 11 months + this month
tzinfo = timezone.get_current_timezone()
start_date = datetime(
today.year,
today.month,
1,
tzinfo=tzinfo) - relativedelta(months=11)

where = ("date_trunc('month', tasks_task.created AT TIME ZONE '%s')::date"
% timezone.get_current_timezone_name())

tasks_last_12 = Task.objects.filter(
created__range=(start_date, today),
)
.extra({'month': where})
.values('month')
.order_by('month')
.annotate(
cmpl_time=Avg(F('datetime_completed') - F('datetime_started')),
)
.values_list('month', 'cmpl_time')

...

TypeError: float() argument must be a string or a number, not 'datetime.timedelta'

然后,我尝试使用 Sum 的组合和 Count计算平均值,但这也不起作用:
tasks_last_12 = Task.objects.filter(
created__range=(start_date, today),
)
.extra({'month': where})
.values('month')
.order_by('month')
.annotate(
cmpl_time=Sum(
(F('datetime_completed') - F('datetime_started')) / Count('datetime_completed')

)
)
.values_list('month', 'cmpl_time'))

...

FieldError: Expression contains mixed types. You must set output_field

我该如何解决这个问题?

最佳答案

如果您使用 Postgres,则可以使用 django-pg-utils包为此。将持续时间字段转换为秒,然后取平均值

from pg_utils import Seconds
from django.db.models import Avg

Task.objects.annotate(cmpl_time=Avg(Seconds(F('datetime_completed') - F('datetime_started'))))

关于带有日期时间计算的 Django 查询集注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34538770/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com