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()
}, ...]
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()
}, ...]