Набор запросов Django по времени, начиная с определенного часа и, наконец, отправляя другие результаты. - PullRequest
0 голосов
/ 11 октября 2018

У меня следующий запрос django:

views.some_model.objects.all().order_by('start')

Это прекрасно работает.Результат получается так:

{00:00, 00:30, 02:03, 04:00, 05:33}

Что если мне понадобится запустить order_by с определенного часа и отправить остаток до последнего (также заказанного)?как это:

{02:03, 04:00, 05:33, 00:00, 00:30}

Я знаю, что могу сделать два запроса (один, начиная с нужного мне времени, другой для последней части), но есть ли более питонский способ?

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Мой первый инстинкт - использовать два запроса.Но так как вы хотите найти альтернативу, я придумал этот действительно уродливый запрос -

from django.db.models import Case, When, Value, IntegerField

qs = views.some_model.objects
           .annotate(
               recent=Case(
                   When(start__gt=some_date_var,
                        then=Value(1)),
                   default=Value(0),
                   output_field=IntegerField()))
           .order_by('-recent', 'start')

В основном первый аннот с логическим значением (которое я назвал недавний ) маркировка, если start больше some_date_var (1 означает начало больше, 0 в противном случае).Теперь сделайте заказ сначала по по последнему по убыванию, затем по по началу по возрастанию

0 голосов
/ 11 октября 2018

Попробуйте объединить два запроса, используя union:

qs1 = views.some_model.objects.filter(start_gt=some_date_var).order_by('start')
qs2 = views.some_model.objects.all()
qs1.union(qs2)
...