我有以下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方式吗?
答案 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)。现在,先按 最近 降序排列,然后按 开始 升序