Django-查询最新时间序列对象的最佳方法?

问题描述

比方说,我正在为当日股票价格建模,并为此使用了两个Django模型:Stock和DailyPriceData(此问题简化了)。实际上,Stock具有其他元数据,DailyPriceData具有OHLC数据,数量等:

class Stock(models.Model):
    ticker = models.CharField(max_length=10)

    class Meta:
        unique_together=['ticker']

class DailyPriceData(models.Model):
    stock= models.ForeignKey(Stock,on_delete=models.CASCADE)
    date = models.DateField()
    price = models.DecimalField(max_digits=30,decimal_places=6)

    class Meta:
        unique_together=['stock','date']
        indexes = [
            models.Index(fields=['stock','date']),]

现在,假设有5万个Stock对象,每个Stock对象具有约10年或更长时间的DailyPriceData对象。

提取每个Stock对象的最新DailyPriceData对象以显示在前端的最佳方法是什么?

使用Postgresql,我可以使用.distinct方法完成任务,尽管这非常慢并且不适合前端。

是否应该创建另一个模型对象,如下所示?这是浪费吗?我应该使用信号或管理命令来保持此更新吗?:

class DailyPriceDataLatest(models.Model):
    stock= models.OnetoOneField(Stock,on_delete=models.CASCADE)
    daily_price_data = models.OnetoOneField(DailyPriceData,on_delete=models.CASCADE)

    class Meta:
        unique_together = ['stock']

有没有更好的方法来给这只猫换皮,以便我可以按库存或一组库存对象快速查询最新价格数据?

解决方法

仅提取每个Stock对象的最新DailyPriceData对象以显示在前端的最佳方法是什么?

我认为您可以使用stock.dailypricedata_set.latest('date')来为Stock模型的一个实例检索它。

或者您可以在查询集上使用注释以在每只股票上添加一个字段:

stocks = Stock.objects.annotate(latest_date=models.Max('dailypricedata__date'))

然后您将可以在html中完成此操作:

{% for stock in stocks %}
    {{ stock }} - {{ stock.latest_date %}
{% endfor %}