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

ORM查询异常:.filter()找到记录但同参数.get()返回DoesNotExist

问题分析与解决

核心矛盾

你遇到的问题是:用filter(symbol=symbol, time=datetime_stamp)能查到包含timeframe=H4的记录,但加上timeframe=timeframe用get()查询时却返回DoesNotExist,即便打印的参数看起来完全匹配。

关键排查点

1. 确认数据库中timeframe的实际值

你当前打印的是传入的timeframe变量值,而非数据库记录中存储的timeframe字段值。这很可能是问题根源——比如数据库里的timeframe可能带空格(如'H4 ')、大小写不符(如'h4'),或者存在其他肉眼不可见的字符。

修改打印语句,直接输出数据库记录的timeframe值:

print(f"Filter Record 2: {forex_ohlc.symbol.name}, {forex_ohlc.time}, {forex_ohlc.timeframe}")

对比输出的forex_ohlc.timeframe和传入的timeframe变量,就能确认是否存在值不匹配的情况。

2. 检查时间字段的时区差异

打印的forex_ohlc.time是无时区的2024-04-10 14:00:00,但查询用的datetime_stamp是带时区的2024-04-10 14:00:00+00:00。如果你的ForexOHLC模型中time字段定义为DateTimeField(blank=True, null=True)(无时区),而查询时用带时区的datetime对象,ORM可能会在转换时出现匹配偏差。

尝试将查询的时间转换为无时区格式:

datetime_stamp = datetime.fromtimestamp(timestamp, tz=pytz.UTC).replace(tzinfo=None)

再用这个无时区的datetime_stamp执行get()查询,看是否能匹配。

3. 验证关联对象的一致性

虽然你用Symbol.objects.get(name=symbol_name)获取了symbol对象,但需确认该对象和filter返回记录的symbol是同一个:

print(f"Symbol ID from get: {symbol.id}, Symbol ID from filter record: {forex_ohlc.symbol.id}")

如果ID不一致,说明存在同名的Symbol记录,导致get()查询的关联对象错误。

代码修改示例

结合上述排查,调整后的代码片段如下:

print(f"Filter Query: timeframe={timeframe}, symbol={symbol_name}, time={datetime_stamp}")
forex_ohlc_list = ForexOHLC.objects.filter(symbol=symbol, time=datetime_stamp)
forex_ohlc = forex_ohlc_list[1]
# 打印数据库实际存储的timeframe和symbol ID
print(f"Filter Record 2: {forex_ohlc.symbol.name} (ID:{forex_ohlc.symbol.id}), {forex_ohlc.time}, DB Timeframe:{forex_ohlc.timeframe}")
print(f"Input Timeframe: {timeframe}, Symbol ID from get: {symbol.id}")

print(f"GET Query: timeframe={timeframe}, symbol={symbol_name}, time={datetime_stamp}")
try:
    # 先尝试用无时区时间查询
    query_time = datetime_stamp.replace(tzinfo=None)
    forex_ohlc = ForexOHLC.objects.get(symbol=symbol, time=query_time, timeframe=forex_ohlc.timeframe)
except ForexOHLC.DoesNotExist:
    # 再尝试原时区时间查询
    try:
        forex_ohlc = ForexOHLC.objects.get(symbol=symbol, time=datetime_stamp, timeframe=forex_ohlc.timeframe)
    except ForexOHLC.DoesNotExist:
        print("No record found even with adjusted parameters.")

内容的提问来源于stack exchange,提问作者Vibe Improvement

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 17:53:10