问题描述
比方说,我正在为当日股票价格建模,并为此使用了两个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 %}