EDIT: Det lykkedes mig at reformere løsningen ved hjælp af Django underforespørgsler.
Vi kan oversætte forespørgslen til Django ORM ved hjælp af Djangos aggregates with SubQuery expressions
:
-
Opret en underforespørgsel for at hente den laveste
close
for hvertsymbol
:from django.db.models import OuterRef, Subquery, Min lows = StockHistory.objects.filter( stock=OuterRef('stock'), trading_date__gte='2017-05-04' ).values('stock__symbol') .annotate(low=Min('close')) .filter(trading_date__gte='2018-04-30')
-
Opdeling:
filter
forespørgslen for kun at få aktierne medtrading_date >= '2017-05-04'
.- "GROUP BY"
stock__symbol
(eksempler på gruppe af i Djnago:GROUP BY ... MIN/MAX
,GROUP BY ... COUNT/SUM
). annotate
den laveste (low
) pris til hvert element.filter
forespørgselssættet igen for kun at få objekter med enlow
felt, der forekommer påtrading_date >= '2018-04-30'
.
-
Mellemresultat:
Selvom vi ikke kan få et resultat på dette stadium, vil underforespørgslen se sådan ud:
[ {'stock__symbol': 'A', 'low': Decimal('105.00000')}, {'stock__symbol': 'C', 'low': Decimal('90.00000')} ]
Vi mangler
trading_date
.
-
-
Brug underforespørgslen til at hente den specifikke
StockHistory
objekter:StockHistory.objects.filter( stock__symbol=Subquery(lows.values('stock__symbol')), close=Subquery(lows.values('low')), trading_date__gte='2018-04-30' ).values('stock__symbol', 'trading_date', 'close') .order_by('stock__symbol')
-
Opdeling:
lows.values('stock__symbol')
og lows.values('low') henter de respektive værdier fra underforespørgslen.filter
forespørgslen modlows
underforespørgselsværdier. Ogsåfilter
mod den angivne dato for at eliminere lavclose
priser, der fandt sted før denne dato.- Hent de angivne
values
. - Bestil resultatet efter
stock__symbol
(som standardascending
).
-
Resultat:
[ { 'close': Decimal('105.00000'), 'trading_date': datetime.date(2018, 5, 3), 'stock__symbol': 'A' }, { 'close': Decimal('90.00000'), 'trading_date': datetime.date(2018, 5, 4), 'stock__symbol': 'C' } ]
-