Django ORM: .filter() находит запись, а .get() с теми же параметрами запроса - нет
Я выполняю ORM-запрос с использованием .filter без указания временных рамок, который возвращает две записи. Затем я печатаю значения столбцов этих записей, чтобы убедиться, что я не делаю никаких несоответствий, но затем, когда я использую точно такие же значения в методе .GET, я получаю ошибку DoesNotExist, хотя он только что напечатал эту запись. Пожалуйста, проверьте, является ли ваш комментарий действительным на основе распечатанных утверждений, прежде чем отправлять глупые комментарии типа: mAyBe yOu mAde A sPelLinG erRoR?!
Вот отпечатки:
Filter Query: timeframe=H4, symbol=XAUUSD, time=2024-04-10 14:00:00+00:00
Filter Record 2: XAUUSD, 2024-04-10 14:00:00, H4
GET Query: timeframe=H4, symbol=XAUUSD, time=2024-04-10 14:00:00+00:00
No record found.
@csrf_exempt
@require_http_methods(["POST"])
def get_label_data(request):
data = json.loads(request.body)
data = data.get('data')
timestamp = data.get('timestamp')
symbol_name = data.get('symbol')
label_name_str = data.get('label_name')
timeframe = data.get('timeframe')
symbol = Symbol.objects.get(name=symbol_name)
datetime_stamp = datetime.fromtimestamp(timestamp, tz=pytz.UTC)
print(f"Filter Query: timeframe={timeframe}, symbol={symbol_name}, time={datetime_stamp}")
forex_ohlc = ForexOHLC.objects.filter(symbol=symbol, time=datetime_stamp)
forex_ohlc = list(forex_ohlc)[1]
print(f"Filter Record 2: {forex_ohlc.symbol.name}, {forex_ohlc.time}, {timeframe}")
print(f"GET Query: timeframe={timeframe}, symbol={symbol_name}, time={datetime_stamp}")
try:
forex_ohlc = ForexOHLC.objects.get(symbol=symbol, time=datetime_stamp, timeframe=timeframe)
except ForexOHLC.DoesNotExist:
print("No record found.")
except ForexOHLC.MultipleObjectsReturned:
print("Multiple records found.")
except Exception as e:
print(f"An unexpected error occurred: {e}")
try:
labels = TickLabel.objects.get(forex_ohlc=forex_ohlc, symbol=symbol, label_name__name=label_name_str)
return JsonResponse({
'label_name': labels.label_name.name,
'label_type': labels.label_type.name,
'hasLabel': True
})
except TickLabel.DoesNotExist:
return JsonResponse({'hasLabel': False})
Я думаю, что .filter()
и .get()
запросы, которые вы показали, НЕ равны, потому что первый использует 2 параметра фильтра, а во втором запросе добавляется еще и третий параметр (timeframe
):
forex_ohlc = ForexOHLC.objects.filter(symbol=symbol, time=datetime_stamp)
forex_ohlc = ForexOHLC.objects.get(symbol=symbol, time=datetime_stamp, timeframe=timeframe)
Это может означать, что 2 записи, найденные по запросу фильтра, имеют значение timeframe
, отличное от значения H4
.
Обратите внимание, что при печати найденных записей ваш код на самом деле не печатает forex_ohlc.timeframe
, а вместо этого печатает только переменную фильтра timeframe
.
print(f"Filter Record 2: {forex_ohlc.symbol.name}, {forex_ohlc.time}, {timeframe}")