gpt4 book ai didi

python - 计算平均交货时间(天) Django ORM

转载 作者:行者123 更新时间:2023-12-05 04:26:25 25 4
gpt4 key购买 nike

我想使用 ORM 单个查询来计算产品的平均交货时间(以天为单位)(使用单个查询的原因是,我在数据库中有 10000 多条记录并且不想在循环中迭代它们)。这是模型文件的示例,我有:

class Product(models.Model):
name = models.CharField(max_length=10)


class ProductEvents(models.Model):

class Status(models.TextChoices):
IN_TRANSIT = ("in_transit", "In Transit")
DELIVERED = ("delivered", "Delivered")

product = models.ForiegnKey(Product, on_delete=models.CASCADE)
status = models.CharField(max_length=255, choices=Status.choices)
created = models.DateTimeField(blank=True)

计算 1 个产品的交货时间是:

product = Product.objects.first()
# delivered_date - in_transit_date = days_taken
duration = product.productevent_set.get(status='delivered').created - product.productevent_set.get(status='in_transit').created

我来这里是为了让您帮助我自己着手解决这个问题,这样我就可以计算所有产品之间的平均时间。由于性能原因,我更希望它在单个查询中完成。

最佳答案

一个基本的解决方案是用状态为“运输中”的相关事件的最短创建时间来注释每个产品,并为具有已交付状态的事件选择最长时间,然后注释差异并汇总差异的平均值

from django.db.models import Min, Max, Q, F, Avg

Product.objects.annotate(
start=Min('productevents__created', filter=Q(productevents__status=ProductEvents.Status.IN_TRANSIT)),
end=Max('productevents__created', filter=Q(productevents__status=ProductEvents.Status.DELIVERED))
).annotate(
diff=F('end') - F('start')
).aggregate(
Avg('diff')
)

返回一个应该看起来像的字典

{'diff__avg': datetime.timedelta(days=x, seconds=x)}

关于python - 计算平均交货时间(天) Django ORM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73060231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com