【问题标题】:Django: Querying time from datetime fieldsDjango:从日期时间字段查询时间
【发布时间】:2011-03-11 13:07:31
【问题描述】:

在基于 Django 的 postgresql db 上,我如何按时间过滤日期时间字段,如下所示?

class Foo(models.Model):
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()

IE:我想用“16:30”start_date 和“19:00”end_date 过滤 Foo 对象。

谢谢。

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    添加一个 TimeField 怎么样? http://docs.djangoproject.com/en/dev/ref/models/fields/#timefield

    否则,您需要编写自定义查询以利用数据库的时间功能,因为 DateTimeFields 在 Django 中本身没有该功能。

    您可以考虑编写一个函数,将 start_date 中的小时和分钟非规范化为新的 start_time 字段,然后查询 start_time 字段。

    【讨论】:

    • 很好,没有注意到我们有时间字段 :) 谢谢!
    • 谁反对这个?当您对它投反对票时,也许可以添加评论以说明此解决方案的缺点?看到有多少人不想对他们的数据库进行非规范化,我总是感到惊讶。对我来说,这种对非规范化的恐惧实际上增加了应用程序的复杂性,并且随着应用程序的变大而减慢了应用程序的速度。见agiledata.org/essays/dataModeling101.html#Denormalize
    【解决方案2】:

    解决我自己的问题:

       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])
    

    【讨论】:

    • 请记住,任何执行这样的函数调用的查询都会随着记录数的增加而变慢。在某些时候,如果您发现速度变慢,非规范化应该会在读取方面提供速度优势。
    【解决方案3】:

    在您的情况下,数据库规范化看起来是最好的解决方案,因为执行时间和系统负载会随着您的相关数据库表保留更多记录而增加...

    另一个不使用数据库过滤器函数的解决方案是使用 filter 和 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)
    

    但是在大​​型数据集上使用它需要太多的时间和系统资源。

    【讨论】:

      【解决方案4】:

      试试

      Foo.objects.filter(start_date = MyDate1, end_date = MyDate2)
      

      其中MyDate1MyDate2 是您定义的日期时间对象。应该可以吧?

      【讨论】:

      • 唉 "16:30" 是一个 Time 对象,否则我没有问题。
      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 2018-08-06
        • 2014-06-29
        • 2018-05-31
        • 2016-07-09
        • 2012-10-14
        • 1970-01-01
        • 2012-02-27
        • 2020-12-16
        相关资源
        最近更新 更多