Django:从datetime字段查询时间

时间:2011-03-11 13:07:32

标签: django django-models

在基于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对象。

感谢。

5 个答案:

答案 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)

其中MyDate1MyDate2是您定义的日期时间对象。它应该工作,对吗?

答案 4 :(得分:-1)

我认为您需要使用范围[1]。

[1] http://docs.djangoproject.com/en/1.2/ref/models/querysets/#range