如何将SQL语句转换为Django查询语句?附股票分析模型代码
嘿,我知道你正在开发Python/Django的股票分析应用,想要把SQL语句转换成Django ORM查询对吧?虽然你没贴出具体要转换的SQL,但我结合你给出的Stock和StockHistory模型,整理了几个常见场景的转换示例,你可以直接参考或者套用到自己的需求里:
1. 查询单只股票的所有历史交易数据
假设你的SQL是这样的:
SELECT * FROM stock_history WHERE stock_id = (SELECT id FROM stock WHERE symbol = 'AAPL');
对应的Django ORM有两种简洁写法:
# 方式1:先获取目标股票对象,再通过关联字段查询历史 aapl_stock = Stock.objects.get(symbol='AAPL') all_history = aapl_stock.StockHistory_stock.all() # 方式2:直接通过StockHistory过滤,利用双下划线跨表查询 all_history = StockHistory.objects.filter(stock__symbol='AAPL')
2. 查询指定日期范围内的股票收盘价
比如要查AAPL最近30天的收盘价,SQL大概是:
SELECT trading_date, close FROM stock_history
WHERE stock_id = (SELECT id FROM stock WHERE symbol='AAPL')
AND trading_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)
ORDER BY trading_date DESC;
对应的ORM写法:
from django.utils import timezone from datetime import timedelta # 计算30天前的日期 thirty_days_ago = timezone.now() - timedelta(days=30) # 过滤并排序,只取需要的字段提升性能 recent_close_data = StockHistory.objects.filter( stock__symbol='AAPL', trading_date__gte=thirty_days_ago ).values('trading_date', 'close').order_by('-trading_date')
3. 聚合计算:获取单只股票的平均收盘价
如果你的SQL是计算平均收盘价:
SELECT AVG(close) as avg_close FROM stock_history WHERE stock_id = (SELECT id FROM stock WHERE symbol='AAPL');
用ORM的aggregate方法就能实现:
from django.db.models import Avg avg_close_result = StockHistory.objects.filter(stock__symbol='AAPL').aggregate(avg_close=Avg('close')) # 返回结果是字典:{'avg_close': Decimal('XX.XX')}
4. 分组统计:每天所有股票的平均收盘价
如果要按日期分组统计全市场的每日平均收盘价,SQL可能是:
SELECT trading_date, AVG(close) as daily_avg FROM stock_history GROUP BY trading_date ORDER BY trading_date DESC;
对应的ORM写法用annotate实现分组聚合:
from django.db.models import Avg daily_market_avg = StockHistory.objects.values('trading_date').annotate(daily_avg=Avg('close')).order_by('-trading_date')
小建议
你的StockHistory模型里related_name设置成了StockHistory_stock,这个命名有点冗长,建议改成更直观的名字(比如history),这样后续查询的时候代码会更易读:
# 修改StockHistory的ForeignKey字段 stock = models.ForeignKey(Stock, related_name='history', editable=False) # 之后查询就能写成:aapl_stock.history.all()
如果你有更复杂的SQL(比如多表JOIN、子查询、窗口函数等),可以把具体的SQL语句贴出来,我再帮你转换成对应的ORM写法~
内容的提问来源于stack exchange,提问作者Saqib Ali

