如何在Django中查询一天中某个小时之前创建的对象?

时间:2015-04-17 18:01:55

标签: python django

在Django中,我试图仅将查询过滤到当天某个小时之前创建的对象。我有一个名为'created_at'的日期​​时间字段,它存储了创建该对象的日期时间。

我想做的是:

query = query.filter(created_at__hour__lte=10)

我希望获得在上午10点之前创建的所有对象。但是,当我尝试时,我得到了一个:

FieldError: Join on field 'created_at' not permitted. Did you misspell 'hour' for the lookup type?

我可以遍历每一天并获得当天的对象,但这似乎非常低效。有没有办法可以在一个查询中执行此操作?如果没有,运行这种过滤器的最快方法是什么?

3 个答案:

答案 0 :(得分:1)

__hour上的{p> DateTimeField是查找类型,因此您无法将其与其他查找类型(如__lte)混合使用。您可以使用Q个对象构建过滤器,EG:

before_ten = Q(created_at__hour=0)
for hour in range(1, 11):
    before_ten = before_ten | Q(created_at__hour=hour)
query = query.filter(before_ten)

如果您可以更改数据模型,则可以更方便地保存创建时间TimeField以及现有created_at

答案 1 :(得分:0)

import datetime
start_time = datetime.datetime.now().replace(hour=00, minute=00)
certain_hour = 10
end_time = start_time.replace(hour=certain_hour)

query = query.filter(created_at__range=(start_time, end_time)

答案 2 :(得分:0)

在Django 1.9+中,您可以链接小时查找,例如created_at__hour__lte,因此来自问题的查询将工作。

query = query.filter(created_at__hour__lte=10)