You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将指定股票分析SQL转换为Django QuerySet?(后续问询)

请注意:本问题是我几天前提出的此问题的后续,并非重复提问。我要在Django中建模的SQL查询以及加载的测试数据存在细微但重要的差异。

我正在开发一个Python/Django应用程序用于股票分析。

我有两个非常简单的模型如下:

class Stock(models.Model):
    symbol = models.CharField(db_index=True, max_length=5, null=False, editable=False, unique=True)

class StockHistory(models.Model):
    stock = models.ForeignKey(Stock, related_name='StockHistory_stock', editable=False)
    trading_date = models.DateField(db_index=True, null=False, editable=False)
    close = models.DecimalField(max_digits=12, db_index=True, decimal_places=5, null=False, editable=False)

    class Meta:
        unique_together = ('stock', 'trading_date')

我已填充以下测试数据:

import datetime

a = Stock.objects.create(symbol='A')
b = Stock.objects.create(symbol='B')
c = Stock.objects.create(symbol='C')
d = Stock.objects.create(symbol='D')

StockHistory.objects.create(trading_date=datetime.date(2018,1,1), close=200, stock=a)
StockHistory.objects.create(trading_date=datetime.date(2018,1,2), close=150, stock=a)
StockHistory.objects.create(trading_date=datetime.date(2018,1,3), close=120, stock=a)
StockHistory.objects.create(trading_date=datetime.date(2018,4,28), close=105, stock=a)
StockHistory.objects.create(trading_date=datetime.date(2018,5,2), close=105, stock=a)
StockHistory.objects.create(trading_date=datetime.date(2018,5,3), close=105, stock=a)

StockHistory.objects.create(trading_date=datetime.date(2017,5,2), close=400, stock=b)
StockHistory.objects.create(trading_date=datetime.date(2017,11,11), close=200, stock=b)
StockHistory.objects.create(trading_date=datetime.date(2017,11,12), close=300, stock=b)
StockHistory.objects.create(trading_date=datetime.date(2017,11,13), close=400, stock=b)
StockHistory.objects.create(trading_date=datetime.date(2017,11,14), close=500, stock=b)

StockHistory.objects.create(trading_date=datetime.date(2018,4,28), close=105, stock=c)
StockHistory.objects.create(trading_date=datetime.date(2018,4,29), close=106, stock=c)
StockHistory.objects.create(trading_date=datetime.date(2018,4,30), close=107, stock=c)
StockHistory.objects.create(trading_date=datetime.date(2018,5,1), close=108, stock=c)
StockHistory.objects.create(trading_date=datetime.date(2018,5,2), close=109, stock=c)
StockHistory.objects.create(trading_date=datetime.date(2018,5,3), close=110, stock=c)
StockHistory.objects.create(trading_date=datetime.date(2018,5,4), close=90, stock=c)

我想要找出所有在过去一周内创年度新低的股票。

为简化问题,假设我要找出自'2017-05-04'以来的最低点出现在'2018-04-30'或之后的所有股票。以下是我编写的可正常运行的SQL语句:

select s.symbol, min(sh.trading_date), low_table.low
from (
    select stock_id, min(close) as low
    from stocks_stockhistory
    where trading_date >= '2017-05-04'
    group by stock_id
) as low_table, stocks_stockhistory as sh, stocks_stock as s
where sh.stock_id = low_table.stock_id
and sh.stock_id = s.id
and sh.close = low_table.low
and sh.trading_date >= '2018-04-30'
group by s.symbol, low_table.low
order by s.symbol asc;

+--------+----------------------+--------------------+
| symbol | min(sh.trading_date) | min(low_table.low) |
+--------+----------------------+--------------------+
| A      | 2018-05-02           | 105.00000          |
| C      | 2018-05-04           | 90.00000           |
+--------+----------------------+--------------------+
2 rows in set (0.01 sec)

但我需要帮助编写能得到相同结果的Django QuerySet查询语句。此前问题的答案得到了3行结果,而非预期的2行,该如何解决?

内容的提问来源于stack exchange,提问作者Saqib Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:22:25