从特定小时开始的时间按Django顺序查询集,最后发送其他结果

时间:2018-10-11 15:52:56

标签: python django django-queryset

我有以下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}

我知道我可以进行两个查询(一个从我需要的时间开始,另一个在最后一部分),但是还有更多的Python方式吗?

2 个答案:

答案 0 :(得分:0)

尝试使用union合并两个查询:

# sample data (3 groups)
set.seed(42) # for reproducability
dates <- seq.Date(Sys.Date(), Sys.Date() + 4, by = "day")
df <- data.frame(
    id = sample(c(1,2,3), 10, replace = TRUE),
    date = sample(c(dates, NA), 10, replace = TRUE)
)

# check the data.frame
print(df)

# using dplyr
# install.packages("dplyr")
library(dplyr)

df %>%
    group_by(id) %>%
    mutate(new_date = max(date, na.rm = TRUE))

答案 1 :(得分:0)

我的第一个直觉是使用两个查询。但是,由于您想探索替代方法,因此我提出了一个看起来非常难看的查询-

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')

如果 开始 大于,则基本上首先使用布尔值(我称为 recent )进行注释。 some_date_var (1表示开始更大,否则为0)。现在,先按 最近 降序排列,然后按 开始 升序

相关问题