【发布时间】:2020-12-02 19:03:55
【问题描述】:
我在 django 中有以下查询:
end_date = timezone.now()
start_date = end_date + timedelta(-5*365)
queryset = (
DailyPriceHistory
.objects
.filter(symbol=symbol,datetime_utc__range=(start_date, end_date))
.order_by('datetime')
.order_by('creation_time')
.values_list('high','low','open','datetime','close','creation_time')
)
它生成的Sql是
SELECT `daily_price_history`.`high`,
`daily_price_history`.`low`,
`daily_price_history`.`open`,
`daily_price_history`.`datetime`,
`daily_price_history`.`close`,
`daily_price_history`.`creation_time`
FROM `daily_price_history`
WHERE (`daily_price_history`.`datetime_utc`
BETWEEN '2015-12-04 18:43:28.710229'
AND '2020-12-02 18:43:28.710229'
AND `daily_price_history`.`symbol` = 'A')
ORDER BY `daily_price_history`.`creation_time` ASC
目前我有 symbol 和 datatime 作为单独的索引列
我找到了不遵循过滤器顺序的原因。即.filter(symbol=symbol,datetime_utc__range=(start_date, end_date))
我想要
WHERE (`daily_price_history`.`symbol` = 'A'
AND `daily_price_history`.`datetime_utc`
BETWEEN '2015-12-04 18:43:28.710229'
AND '2020-12-02 18:43:28.710229')
但它使用
WHERE (`daily_price_history`.`datetime_utc`
BETWEEN '2015-12-04 18:43:28.710229'
AND '2020-12-02 18:43:28.710229'
AND `daily_price_history`.`symbol` = 'A')
我也没有在 sql 中看到 order_by('datetime'),这是因为 datetime 已编入索引
【问题讨论】:
-
您的问题没有重点,因为您有多个问题。总结一下:为什么你认为语句的顺序很重要,你认为使用两次 order_by 应该产生什么docs.djangoproject.com/en/3.1/ref/models/querysets/…