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

如何将SQL语句转换为Django查询语句?附股票分析模型代码

Django ORM 转换常见SQL查询示例(基于你的股票分析模型)

嘿,我知道你正在开发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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:18:26