EDYTUJ: Udało mi się zreformować rozwiązanie za pomocą podzapytań Django.
Możemy przetłumaczyć zapytanie do ORM Django za pomocą aggregates with SubQuery expressions
:
-
Utwórz podzapytanie, aby pobrać najniższe
close
dla każdegosymbol
: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')
-
Podział:
filter
queryset do pobrania tylko akcji ztrading_date >= '2017-05-04'
.- „GRUPA WG”
stock__symbol
(przykłady grupowania według w Djnago:GROUP BY ... MIN/MAX
,GROUP BY ... COUNT/SUM
). annotate
najniższy (low
) cena za każdy element.filter
queryset ponownie, aby uzyskać tylko obiekty zlow
pole występujące w dniutrading_date >= '2018-04-30'
.
-
Wynik pośredni:
Chociaż na tym etapie nie możemy uzyskać wyniku, podzapytanie będzie wyglądać tak:
[ {'stock__symbol': 'A', 'low': Decimal('105.00000')}, {'stock__symbol': 'C', 'low': Decimal('90.00000')} ]
Brakuje
trading_date
.
-
-
Wykorzystaj podzapytanie, aby pobrać konkretną
StockHistory
obiekty: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')
-
Podział:
lows.values('stock__symbol')
i lows.values('low') pobierają odpowiednie wartości z podzapytania.filter
zestaw zapytań w stosunku dolows
wartości podzapytania. Równieżfilter
w stosunku do określonej daty w celu wyeliminowania niskiegoclose
ceny występujące przed tą datą.- Pobierz określone
values
. - Uporządkuj wynik według
stock__symbol
(domyślnieascending
).
-
Wynik:
[ { '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' } ]
-