如何注释已注释值的计数?

时间:2018-01-04 21:26:21

标签: python django orm

我有一个名为Order的模型,其中包含timestamp_delivered(日期时间字段)。模型订单具有与之关联的驱动程序。我想知道每个司机发出订单的天数。

我正在尝试以下查询:

Order.objects.annotate(
    date=Cast('timestamp_delivered'), DateField()
).values(
    'driver_id'
).annotate(
    days=Count('date')
)

但得到了错误:

  

KeyError:date

我也尝试过运行以下命令:

Order.objects.values(
    'driver_id'
).annotate(
    date=Cast('timestamp_delivered'), DateField()
).annotate(
    days=Count('date')
).values_list(
    'driver_id', 'days'
)

获得输出

[(Driver1, 1), (Driver2, 1), (Driver2, 1)... ]

然而,我期待的输出是这样的:

[(Driver1, 2), (Driver2, 4), (Driver3, 8)... ]

1 个答案:

答案 0 :(得分:0)

使用values会导致其前面的注释丢失,从而导致您的密钥错误。如果你继续使用第二个解决方案,你将遇到类似的问题。

诀窍是对修改后的列进行计数。 TruncDate函数有助于解决这个问题:

from django.db.models.functions import TruncDate

DeliveryOrder.objects.
  values('driverid').
  annotate(deliverydays=Count(TruncDate('timestamp_delivered'), distinct=True))

在Django shell中验证