Django Datetime Field Query - Подреждане по време/час

Извършвам заявка, за да върна всички WorkOrders, които имат насрочена среща за днес, като използвам полето за дата и час 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? Тъй като datetime търсене на поле от hour бяха добавени в 1.6. Ако е така, тогава за съжаление няма да имате достъп до hour по този начин. Можете обаче да използвате този метод за достъп до day.

По този начин можете да промените своя order_by на:

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

Това първо ще подреди по дата и час във възходящ ред (което ще се погрижи за часовете) и след това по ден в низходящ ред.

ИЛИ, можете да използвате extra() модификатор за избор на часа от дата и час и подреждане по него. Ето пример за избор на месец от дата и час. Въпреки това ще бъде малко по-сложно поради ForeignKey.

person pcoronel    schedule 12.05.2014
comment
Използвам Django 1.6. За съжаление не мога да осъществя достъп до __day, __hour, __month, __year и т.н. от order_by, без това да доведе до грешка като тази: FieldError: Присъединяването към полето 'start' не е разрешено. Написахте ли грешно „ден“ за типа търсене? Ще проверя допълнителното поле и в по-лошия случай може да видя анотиране на отделно поле за време, по което да сортирате. Благодаря ви за помощта pcoronel. - person Del; 12.05.2014