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
closethấ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:
-
filterbộ 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). -
annotatethấp nhất (low) giá cho mọi yếu tố. -
filterbộ truy vấn một lần nữa để chỉ nhận các đối tượng cólowtrườ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
StockHistorycụ 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. -
filterbộ truy vấn so vớilowsgiá trị truy vấn con. Ngoài rafilterso với ngày được chỉ định để loại bỏclosethấ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' } ]
-