Django 聚合每个外键的记录

Django aggregating records for each foreign key

class Order(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    category = models.ForeignKey(
        Category, null=True, on_delete=models.SET_NULL
    )
    user = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
    placed = models.DateTimeField(auto_now=True)
    shipped = models.DateTimeField(null=True)
    delivered = models.DateTimeField(null=True)

我想统计每个类别的订单处理速度 其中处理时间为 delivered - shipped

结果我想达到这样的效果:

[
    {
        "category": <category 1>
        "processed_time": <average processed time in seconds>
    },
    {
        "category": <category 2>
        "processed_time": <average processed time in seconds>
    },
    {
        "category": <category 3>
        "processed_time": <average processed time in seconds>
    },
]

我可以在 ORM 之外计算这个,但我想用 annotation/aggregation

以某种方式实现这个
delivered = delivered_qs.annotate(first_processed=Min("delivered"), last_processed=Max("delivered")) \
    .aggregate(processed_time=F("last_processed")-F("first_processed"))

此 QS returns 时间仅适用于所有类别,我不知道如何检索每个类别的时间

您想做一个 group by,这在 Django 中有点奇怪。有关详细信息,请参阅 the documentation

但是通过首先使用 .values,您再次说出您将根据类别分组的查询集。比你确定最小值、最大值和差值。

delivered = (
    delivered_qs
        .values('category')
        .annotate(
            first_processed=Min("delivered"), 
            last_processed=Max("delivered"),
            processed_time=F("last_processed") - F("first_processed"),
        ) 
)

根据我的预期,return:

[{
    "category": 1,
    "first_processed": timedelta(), 
    "last_processed": timedelta(), 
    "processed_time": timedelta()
}, ...]