微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 %}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。