【问题标题】:Django aggregating records for each foreign keyDjango为每个外键聚合记录
【发布时间】:2021-09-23 03:57:32
【问题描述】:
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 之外进行计算,但我想通过注释/聚合以某种方式实现这一点

delivered = delivered_qs.annotate(first_processed=Min("delivered"), last_processed=Max("delivered")) \
    .aggregate(processed_time=F("last_processed")-F("first_processed"))

这个 QS 只返回所有类别的时间,我不知道如何检索每个单独类别的时间

【问题讨论】:

    标签: django postgresql django-models django-orm


    【解决方案1】:

    你想做一个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"),
            ) 
    )
    

    在我的预期中,它会返回:

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

    【讨论】:

      猜你喜欢
      • 2020-05-04
      • 2014-03-20
      • 2020-06-08
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      • 2018-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多