CHỈNH SỬA: Tôi đã quản lý để cải cách giải pháp bằng cách sử dụng truy vấn con Django.
Chúng tôi có thể dịch truy vấn sang Django ORM bằng cách sử dụng aggregates with SubQuery expressions
:
-
Tạo một truy vấn con để truy xuất
close
thấp nhất cho mọi ký hiệusymbol
: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')
-
Phân tích:
-
filter
bộ truy vấn để chỉ lấy các cổ phiếu cótrading_date >= '2017-05-04'
. - "GROUP BY"
stock__symbol
(ví dụ về nhóm theo Djnago:GROUP BY ... MIN/MAX
,GROUP BY ... COUNT/SUM
). -
annotate
thấp nhất (low
) giá cho mọi yếu tố. -
filter
bộ truy vấn một lần nữa để chỉ nhận các đối tượng cólow
trường xảy ra vàotrading_date >= '2018-04-30'
.
-
-
Kết quả Trung gian:
Mặc dù chúng ta không thể nhận được kết quả ở giai đoạn này, nhưng truy vấn con sẽ có dạng như sau:
[ {'stock__symbol': 'A', 'low': Decimal('105.00000')}, {'stock__symbol': 'C', 'low': Decimal('90.00000')} ]
Chúng tôi thiếu
trading_date
.
-
-
Sử dụng truy vấn con để truy xuất
StockHistory
cụ thể đối tượng: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')
-
Phân tích:
-
lows.values('stock__symbol')
và lows.values ('low') truy xuất các giá trị tương ứng từ truy vấn con. -
filter
bộ truy vấn so vớilows
giá trị truy vấn con. Ngoài rafilter
so với ngày được chỉ định để loại bỏclose
thấp giá xảy ra trước ngày đó. - Nhận các giá trị
symbol
được chỉ định . - Sắp xếp kết quả theo
stock__symbol
(theo mặc địnhascending
).
-
-
Kết quả:
[ { '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' } ]
-