【问题标题】:Django QuerySet selecting rows according a 'valid_from' columnDjango QuerySet 根据“valid_from”列选择行
【发布时间】:2018-02-19 20:32:55
【问题描述】:

我有一个与日期相关的产品价格类似于此的 Django 模型:

Class ProductPrice(models.Model):
    product = models.ForeignKey(Product, related_name='prices')
    valid_from = models.DateField()
    price = models.DecimalField(max_digits=7, decimal_places=2)

“valid_from”日期可以是过去和未来。

如果我需要在 'some_date' 获得单一产品的有效价格,这很简单:

price = product.prices.filter(valid_from__lte=some_date).latest('valid_from')

但是,我需要一个包含给定日期所有价格的列表。
我如何获得一个 QS,它为特定日期的所有(或一组)产品选择有效价格?

EG,从 2017 年 9 月 1 日开始,每个小部件的价格为 3 美元,但从 2017 年 10 月 4 日开始,每个小部件的价格为 4 美元。如果询问 2017 年 9 月 11 日的价格,它需要找到 3 美元的值 - 示例 latest() 查询就是这样做的对于单个产品,但问题是如何为多个产品执行此操作。基本上是按产品分组的一组最新价格。
感谢@PeterDeGlopper 提供的示例!

【问题讨论】:

  • 当我在过去的项目中实现类似的模式时,我也使用了一个可以为空的end_date 字段来支持这种查询。您是否可以修改模型以包含类似的内容?
  • 这会起作用(就像一个 sql select between),但它需要一个完整的机制来自动设置“end_date”。我宁愿不必这样做......
  • 我使用保存后信号 IIRC 进行了此操作 - 每当保存价格模型时,将任何结束日期为空的旧记录设置为在新记录的开始日期结束。看起来数据库应该能够为您解答。
  • 是的,我可能最终会这样做。不过,遗憾的是 Django ORM 没有提供原生解决方案。
  • 也许你可以用数据库视图来做到这一点,ORM 将视图视为只读模型是没有问题的。

标签: python django


【解决方案1】:

这个怎么样?

prices = ProductPrice.objects.filter(valid_from=GIVEN_DATE).values_list('price')

【讨论】:

  • 我相信OP想要的是尚未被取代的最新价格,而不仅仅是在指定日期生效的价格。例如,小部件从 2017 年 9 月 1 日开始每个售价 3 美元,但从 2017 年 10 月 4 日开始每个售价 4 美元。如果在 2017 年 9 月 11 日询问价格,它需要找到 3 美元的值 - 示例 latest() 查询针对单个产品,但问题是如何为多个产品做到这一点。基本上是一组按产品分组的最新价格,但我不记得 Django 聚合 API 是否可以轻松表达。
  • 感谢@PeterDeGlopper 对我的问题的解释! :-)
猜你喜欢
  • 2018-01-20
  • 1970-01-01
  • 2023-02-03
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多