17

我到处寻找答案,但找不到任何东西。也许这只是一个愚蠢的问题或一个非常棘手的问题。这里是:

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

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

EventType
  name = CharField

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

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

4

3 回答 3

54

只是一个更新。在 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))
于 2015-09-30T01:08:27.280 回答
1

您需要使用额外的方法创建一个查询集,以将日期差异添加到每一行

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

不过要小心,这种方法很慢,而且不会扩展。将计算值存储在 event_type 上是您最好的选择。

于 2010-06-28T09:47:25.067 回答
0

我认为您最好的选择是使用该date_end - date_start列创建一个 SQL 视图,在该视图上创建一个 django 模型,然后您将能够查询该视图并根据需要对其进行注释。我已经使用与您相似的模型完成了此操作,如果您需要,也许我可以为您提取一些有趣的代码。

于 2010-06-28T09:44:58.890 回答