【发布时间】: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 将视图视为只读模型是没有问题的。