UPRAVIT: Podařilo se mi reformovat řešení pomocí dílčích dotazů Django.
Dotaz můžeme přeložit do Django ORM pomocí Django aggregates with SubQuery expressions
:
-
Vytvořte dílčí dotaz pro načtení nejnižší hodnoty
close
pro každýsymbol
: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')
-
Rozdělení:
filter
sada dotazů k získání pouze akcií strading_date >= '2017-05-04'
.- „GROUP BY“
stock__symbol
(příklady skupin podle v Djnago:GROUP BY ... MIN/MAX
,GROUP BY ... COUNT/SUM
). annotate
nejnižší (low
) cena za každý prvek.filter
sadu dotazů znovu, abyste získali pouze objekty slow
pole vyskytující setrading_date >= '2018-04-30'
.
-
Přechodný výsledek:
Ačkoli v této fázi nemůžeme získat výsledek, dílčí dotaz bude vypadat takto:
[ {'stock__symbol': 'A', 'low': Decimal('105.00000')}, {'stock__symbol': 'C', 'low': Decimal('90.00000')} ]
Chybí nám
trading_date
.
-
-
Využijte dílčí dotaz k načtení konkrétní
StockHistory
objekty: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')
-
Rozdělení:
lows.values('stock__symbol')
a lows.values('low') načítají příslušné hodnoty z dílčího dotazu.filter
sada dotazů protilows
hodnoty poddotazu. Takéfilter
proti zadanému datu, aby se eliminovalo nízkéclose
ceny vyskytující se před tímto datem.- Získejte zadané
values
. - Seřaďte výsledek podle
stock__symbol
(ve výchozím nastaveníascending
).
-
Výsledek:
[ { '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' } ]
-