gpt4 book ai didi

python - Django:按组获取最新成本值列表

转载 作者:行者123 更新时间:2023-11-29 06:05:39 25 4
gpt4 key购买 nike

我有以下 Django 模型:

class Costs(models.Model):
"""Represents a cost for a vendor / locale combo."""
valid_from_date = models.DateField()
vendor_id = models.ForeignKey('Vendor')
locale_id = models.ForeignKey('Locale')
cost = models.FloatField()

为了保留历史数据,当供应商/地区组合的成本发生变化时,我们只需使用新的 valid_from_date 向表中添加一个新条目(而不是覆盖旧条目)。

使用 Costs.objects.all() 从表中获取所有数据相当容易。使用 Costs.objects.filter(vendor_id=1, locale_id=10).latest() 也可以轻松获取单个供应商/区域设置的当前值。

我感兴趣的是每个供应商/地区组合的所有最新成本值。所以本质上是对每个组合运行 latest() 函数,并得到一个列表/查询集作为结果。

例如,给定以下一组数据:

  • ID:100,日期:2017-1-1,供应商:1,区域设置:10,费用:1 美元
  • ID:200,日期:2017-2-1,供应商:1,区域设置:10,费用:2 美元
  • ID:300,日期:2017-1-1,供应商:2,区域设置:10,费用:3 美元
  • ID:400,日期:2017-2-1,供应商:2,区域设置:10,费用:4 美元
  • ID:500,日期:2017-1-1,供应商:2,区域设置:20,费用:5 美元

我想要返回以下数据:

  • ID:200,日期:2017-2-1,供应商:1,区域设置:10,费用:2 美元
  • ID:400,日期:2017-2-1,供应商:2,区域设置:10,费用:4 美元
  • ID:500,日期:2017-1-1,供应商:2,区域设置:20,费用:5 美元

我已经通读了 aggregation docs很多次,但似乎找不到任何完美匹配的东西。

我正在使用带有 MySQL 后端的 Django 1.10。

有什么想法吗?谢谢。

最佳答案

如果你有 postgres 作为后端,你可以使用一些 distinct('vendor_id', 'locale_id') 并且很高兴。否则,您必须更有创意:

from django.db.models import Max

ids = Costs.objects.\
values('vendor_id', 'locale_id').\ # grouping based on values will be used for annotation
annotate(mx=Max('id')).\ # annotate the max id for each group
order_by().\ # clear any default ordering to avoid a total mess
values_list('mx', flat=True) # retrieve all the max ids

costs = Costs.objects.filter(id__in=ids)

这应该会导致单个数据库查询。所有这些都可以从 docs on the interaction of values, order_by, and annotate 中艰难地提取出来。 ;-)

关于python - Django:按组获取最新成本值列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41836688/

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