使用平均日期差异注释查询集? (django的)

时间:2010-06-28 08:56:21

标签: django date django-queryset annotate

我搜遍了所有地方寻找答案,却找不到任何答案。也许这只是一个愚蠢的问题或一个非常棘手的问题。这是:

假设我的模型是这个(伪django代码):

Event
  type = ForeignKey(EventType)
  name = CharField
  date_start = DateField
  date_end = DateField

EventType
  name = CharField

我想知道的是每种事件类型的平均持续时间。我现在所做的是计算创建新事件时的平均持续时间(保存方法)并将其存储在EventType的average_duration列中。这种方法的问题在于我无法回答诸如“X年期间 事件的平均持续时间是多少的问题”。因此,我不想添加更多列来回答这些问题,而是希望“实时”完成。

可以通过注释查询集来完成吗?首先,我必须得到每个事件类型的日期差异,然后得出它们的平均值,然后使用该平均值来注释事件查询集,我假设。

3 个答案:

答案 0 :(得分:29)

只是一个更新。在Django> = 1.8中,可以这样做:

from django.db.models import F, ExpressionWrapper, fields

duration = ExpressionWrapper(F('date_end') - F('date_start'), output_field=fields.DurationField())

events_with_duration = Event.objects.annotate(duration=duration)

之后您可以运行以下查询:

events_with_duration.filter(duration__gt=timedelta(days=10))

答案 1 :(得分:1)

我认为最好的办法是创建一个带有date_end - date_start列的SQL视图,在此视图上创建一个django模型,然后您就可以查询视图并根据需要对其进行注释。我已经用你的模型类似物完成了这个,如果你需要,我可以为你提取一些有趣的代码。

答案 2 :(得分:1)

您需要使用extra方法创建一个查询集,以便为每一行添加日期差异

然后使用aggregate方法计算刚刚添加的列的平均值:

但要小心,这种方法很慢,无法扩展。将计算值存储在event_type上是最好的选择。