Запрос поля Django Datetime — порядок по времени/часу

Я выполняю запрос, чтобы вернуть все WorkOrder, у которых назначена встреча на сегодня, используя поле даты и времени start внешнего ключа Appointment. Это запрос, который я использую, и он работает точно так, как ожидалось.

WorkOrder.objects.filter(appointment__start__year=date.today().year, appointment__start__month=date.today().month, appointment__start__day=date.today().day)

Я хотел бы отсортировать их по убыванию даты и по возрастанию часа. Порядок, который я хочу, будет выглядеть примерно так:

11-May-2014 08:00
11-May-2014 10:00
11-May-2014 12:00
10-May-2014 10:00
10-May-2014 13:00
09-May-2014 15:00
...

Я попытался заказать его с помощью таких команд, как:

.order_by("-appointment__start", "appointment__start__hour")

но это приводит к следующей ошибке:

FieldError: Join on field 'start' not permitted. Did you misspell 'hour' for the lookup type?

Кажется, я могу сделать только

.order_by("-appointment__start")

Есть ли другой способ, которым я должен это делать, или это просто то, с чем мне придется жить?


person Del    schedule 12.05.2014    source источник


Ответы (1)


Вы используете версию Django ‹ 1.6? Поскольку в версии 1.6 были добавлены datetime поиск полей с помощью hour . Если это так, то, к сожалению, вы не сможете получить доступ к hour таким образом. Однако вы можете использовать этот метод для доступа к файлу day.

Таким образом, вы можете изменить order_by на:

.order_by("appointment__start", "-appointment__start__day")

Это сначала упорядочит по возрастанию даты и времени (что позаботится о часах), а затем по убыванию дня.

ИЛИ вы можете использовать extra() для выбора часа из даты и времени и упорядочения по нему. Вот пример выбора месяца из даты и времени. Однако это будет немного сложнее из-за ForeignKey.

person pcoronel    schedule 12.05.2014
comment
Я использую Джанго 1.6. К сожалению, я не могу получить доступ к __day, __hour, __month, __year и т. д. из order_by, чтобы это не привело к такой ошибке: FieldError: Присоединение к полю «начало» не разрешено. Вы неправильно написали «день» для типа поиска? Я проверю дополнительное поле и, в худшем случае, я могу увидеть аннотацию отдельного поля времени для сортировки. Спасибо за помощь pcoronel. - person Del; 12.05.2014