[英]Django annotate min and max of filtered foreign key
class Price(models.model):
value = models.DecimalField(...)
stock = models.ForeignKey("Stock", related_name='prices')
class Stock(models.model):
current_evlauation = models.ForeignKey('Price')
last_hour_evlauation = models.ForeignKey('Price')
在以MySQL作為數據庫的Django 1.11.13中,我想優化以下代碼行:
last_hour = datetime.datetime.now() - datetime.timedelta(hours=2)
stock_list = Stock.objects.all()
for stock in stock_list:
stock.last_hour_evaluation = stock.prices.filter(date__gte=last_hour).earliest('date')
stock.current_evaluation = stock.prices.latest('date')
stock.save()
stock_deltas = list(Stock.objects.annotate(delta=F('current_evaluation__value)-F('last_hour_evaluation__value')).values_list('delta', flat=True))
在類似:
stock_deltas = list(Stock.objects\
.annotate(current_eval=..., last_eval=...)\
.annotate(delta=F('current_eval') -F('last_hour_eval'))\
.values_list('delta', flat=True))
(stock_deltas =最近一小時的股票價格變動列表)
有可能這樣做嗎? 否則,如何使用最少的查詢量編寫第一段代碼?
您可以將Max
和Min
與Q objects
結合使用以進行復雜的過濾
Stock.objects.all().annotate(
current_eval=Min('prices__date', filter=Q(prices__date__gte=last_hour)),
last_eval=Max('prices__date')).annotate(
delta=F('current_val') - F('last_eval'))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.