在基于postgresql db的Django上,如何按时间过滤datetimefield,如下所示?
class Foo(models.Model):
start_date = models.DateTimeField()
end_date = models.DateTimeField()
IE:我想用“16:30”start_date和“19:00”end_date过滤Foo对象。
感谢。
答案 0 :(得分:2)
添加TimeField怎么样? http://docs.djangoproject.com/en/dev/ref/models/fields/#timefield
否则,您需要编写自定义查询以利用数据库的时间限制,因为DateTimeFields在Django中本身没有该功能。
您可以考虑编写一个函数来将start_date的小时和分钟非规范化为新的start_time字段,然后查询start_time字段。
答案 1 :(得分:1)
解决我自己的问题:
def query_by_times(start_hour, start_min, end_hour, end_min):
query = 'EXTRACT(hour from start_date) = %i and EXTRACT(minute from start_date) = %i and EXTRACT(hour from end_date) = %i and EXTRACT(minute from end_date) = %i' % (start_hour, start_min, end_hour, end_min)
return Foo.objects.extra(where=[query])
答案 2 :(得分:1)
在您的情况下,数据库规范化看起来是最好的解决方案,因为执行时间和系统负载会随着相关数据库表保留更多记录而上升...
另一个解决方法不使用数据库文件管理器功能使用过滤器和lambda :
from datetime import time
records = Foo.objects.all()
filtered = filter(lambda x: (time(16,30)==x.start_date.time() and time(19,0)==x.end_date.time()), records)
但是在大型数据集上使用它会需要太多的时间和系统资源。
答案 3 :(得分:0)
尝试
Foo.objects.filter(start_date = MyDate1, end_date = MyDate2)
其中MyDate1
和MyDate2
是您定义的日期时间对象。它应该工作,对吗?
答案 4 :(得分:-1)
我认为您需要使用范围[1]。
[1] http://docs.djangoproject.com/en/1.2/ref/models/querysets/#range