EDIT: Saya berhasil mereformasi solusi menggunakan subkueri Django.
Kami dapat menerjemahkan kueri ke Django ORM menggunakan aggregates with SubQuery expressions
:
-
Buat subkueri untuk mengambil
close
terendah untuk setiapsymbol
: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')
-
Perincian:
filter
queryset untuk mendapatkan hanya saham dengantrading_date >= '2017-05-04'
.- "GROUP BY"
stock__symbol
(contoh group by di Djnago:GROUP BY ... MIN/MAX
,GROUP BY ... COUNT/SUM
). annotate
terendah (low
) harga untuk setiap elemen.filter
queryset lagi untuk mendapatkan hanya objek denganlow
kolom terjadi padatrading_date >= '2018-04-30'
.
-
Hasil Antara:
Meskipun kita tidak bisa mendapatkan hasil pada tahap ini, subquery akan terlihat seperti ini:
[ {'stock__symbol': 'A', 'low': Decimal('105.00000')}, {'stock__symbol': 'C', 'low': Decimal('90.00000')} ]
Kami melewatkan
trading_date
.
-
-
Gunakan subkueri untuk mengambil
StockHistory
tertentu objek: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')
-
Perincian:
lows.values('stock__symbol')
dan lows.values('low') mengambil nilai masing-masing dari subquery.filter
queryset terhadaplows
nilai subkueri. Jugafilter
terhadap tanggal yang ditentukan untuk menghilangkanclose
low yang rendah harga yang terjadi sebelum tanggal tersebut.- Dapatkan
values
yang ditentukan . - Pesan hasil berdasarkan
stock__symbol
(secara defaultascending
).
-
Hasil:
[ { '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' } ]
-