Я изо всех сил пытаюсь понять, как работают запросы даты в Django, поскольку я храню базу данных с расписанием поездов. Я хочу получить времена, превышающие текущее время.
Запрос выглядит следующим образом, но возвращает нулевые результаты:
latestdepartures = LatestDepartures.objects.filter(station=startstation,earliest__gte=timezone.now().astimezone(pytz.utc))
Например, в моей базе данных есть запись ниже.
введите описание изображения здесь
Когда я запускаю запрос, я получаю результаты ниже (первая строка - print (timezone.now (). Astimezone (pytz.ut c)):
2020 -08-01 15: 49: 06.610055 + 00: 00
Код, который добавляет данные в базу данных, выглядит так:
def convert_date_time(o):
if isinstance(o, datetime):
return o.__str__()
def updateservices(stationname,destination):
now = datetime.now()
# dd/mm/YY H:M:S
datenow = now.strftime("%d/%m/%Y")
board = DARWIN_SESH.get_station_board(stationname)
stationdict = dict()
stationdict['from'] = stationname
stationdict['name'] = board.location_name
stationdict['servicelist']=[]
services = board.train_services
for s in services:
traindict = dict()
service_details = DARWIN_SESH.get_service_details(s.service_id)
traindict['departuretime'] = datetime.strptime(datenow + " " + service_details.std,'%m/%d/%Y %H:%M').astimezone(pytz.utc)
traindict['callingpoints'] = []
callingpoints = service_details.subsequent_calling_points
for c in callingpoints:
if c.crs == destination:
callingpointdict = dict()
callingpointdict['code'] = c.crs
callingpointdict['name'] = c.location_name
callingpointdict['arrivaltime'] = datetime.strptime(datenow + " " + c.st,'%m/%d/%Y %H:%M').astimezone(pytz.utc)
traindict['callingpoints'].append(callingpointdict)
if len(traindict['callingpoints']) > 0:
stationdict['servicelist'].append(traindict)
#For getting the minimum departure
departures = [s['departuretime'] for s in stationdict['servicelist']]
#Store the train departure object in the database
stationdata = json.dumps(stationdict, default=convert_date_time)
LatestDepartures.objects.create(
station = stationname,
earliest = min(departures),
services = stationdata
)
return stationdata
servicedetails.std будет временем, представленным в 24-часовом формате в строковом формате, например «17:00».
Может ли кто-нибудь помочь, я не уверен, должен ли я где-то изменить формат даты или это связано с тем, как объект datetime создается путем добавления времени.
UPDATE:
Теперь дата сохраняется в другом формате как '% d /% m /% Y% H:% M':
Теперь я получаю даты больше, чем, но один раз текущее время превысило самое раннее в базе данных, запрос по-прежнему возвращает результаты. Пример вывода:
2020-08-01 17:31:21.909052+00:00
print(timezone.now().astimezone(pytz.utc))
2020-08-01 18:03:00+00:00 - Time in database