EDIT: Jag lyckades reformera lösningen med Django-underfrågor.
Vi kan översätta frågan till Django ORM med Djangos aggregates with SubQuery expressions
:
-
Skapa en underfråga för att hämta den lägsta
closeför varjesymbol: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')-
Uppdelning:
filterfrågeuppsättningen för att bara få aktier medtrading_date >= '2017-05-04'.- "GROUP BY"
stock__symbol(exempel på grupp efter i Djnago:GROUP BY ... MIN/MAX,GROUP BY ... COUNT/SUM). annotateden lägsta (low) pris för varje element.filterfrågeuppsättningen igen för att bara få objekten med enlowfält som förekommer påtrading_date >= '2018-04-30'.
-
Mellanresultat:
Även om vi inte kan få ett resultat i detta skede kommer underfrågan att se ut så här:
[ {'stock__symbol': 'A', 'low': Decimal('105.00000')}, {'stock__symbol': 'C', 'low': Decimal('90.00000')} ]Vi saknar
trading_date.
-
-
Använd underfrågan för att hämta den specifika
StockHistoryobjekt: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')-
Uppdelning:
lows.values('stock__symbol')och lows.values('low') hämtar respektive värden från underfrågan.filterfrågeuppsättningen motlowsunderfråga värden. Ävenfiltermot det angivna datumet för att eliminera lågclosepriser som inträffade före detta datum.- Hämta de angivna
values. - Beställ 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' } ]
-