【发布时间】:2020-09-01 00:54:48
【问题描述】:
假设我正在为日终股票价格建模,为此有两个 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']),
]
现在,假设有 50k 个 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']
有没有更好的方法给这只猫剥皮,以便我可以通过股票或股票对象组快速查询最新的价格数据?
【问题讨论】:
-
既然有
unique_together=['stock','date'],为什么不使用select * from daily_price_data where date = %(chosen_day)s而不使用distinct()? -
这是一个很好的问题——虽然不同的 Stock 对象有不同的最新“日期”对象,但它并不能完全按照我们的意愿工作。例如,如果某只股票在某一天被退市或停牌,它的最新 DailyPriceData 对象将与其他股票不同,因此我们无法按特定日期查询,只能查询 max
标签: django database postgresql