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