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

