Django按时间过滤日期时间字段,与日期无关

时间:2015-01-08 16:50:54

标签: python django datetime

我在Django中有一个datetime字段,我想根据时间过滤这个。我不关心特定日期,但我想在7:30之前找到所有交易,例如。

我知道我可以按小时和分钟过滤,例如:

Q(datetime__hour=7) & \
Q(datetime__minute=30)

然而,这将在7:30找到所有交易。您也无法申请gte或lte。即。

(Q(datetime__hour__lte=7) & \
Q(datetime__minute__lte=30)) | \
Q(datetime__hour__lt=7)

唯一似乎是潜在解决方案的是拥有许多查询,例如:

(Q(datetime__hour=7) & \
(Q(datetime__minute=30) | \
 Q(datetime__minute=29) | \
 Q(datetime__minute=28) | \
 ....
 Q(datetime__minute=2) | \
 Q(datetime__minute=1) | \
 Q(datetime__minute=0))) | \
Q(datetime__hour=6) | \
Q(datetime__hour=5) | \
Q(datetime__hour=4) | \
Q(datetime__hour=3) | \
Q(datetime__hour=2) | \
Q(datetime__hour=1) | \
Q(datetime__hour=0)

但这看起来很荒谬。

有人有什么想法吗?

3 个答案:

答案 0 :(得分:1)

只需将日期时间字段拆分为日期和时间字段即可。比你只能按时过滤:

from datetime import combine

class MyModel(models.Model):
    start_date = models.DateField()
    start_time = models.TimeField()

    class Meta:
        ordering = ['start_date', 'start_time']

    def start_datetime(self):
        return combine(self.date, self.time)

我添加了Meta.ordering和start_datetime模型方法,以表明此模型可以使用与DateTimeField的模型相同的方式呈现数据。

现在您可以按时过滤:

objects = MyModel.objects.filter(start_time__lt=time(7, 30))

更新

如果您有已建立的项目,并且许多查询依赖于具有正常的DateTime字段。将日期时间拆分为日期和时间字段需要付出代价:重写查询会丢弃您的项目。还有一种选择:只添加时间字段并保持日期时间字段不变。 save方法可以根据日期时间添加时间。缺点是你的数据库中有重复的数据。它以最小的努力解决您的问题是件好事。

class MyModel(models.Model):
    start_datetime = models.DateTimeField()
    start_time = models.TimeField(blank=True)

    def save(self)
        self.start_time = self.start_datetime.time

所有现有查询都与以前相同,仅按时间过滤:

objects = MyModel.objects.filter(start_time__lt=time(7, 30))

答案 1 :(得分:0)

在Django 1.7+中,您可以使用转换从时间戳中提取分钟和小时。看到 https://docs.djangoproject.com/en/1.7/howto/custom-lookups/#a-simple-transformer-example了解详情。

答案 2 :(得分:0)

思路:

  • 使用raw sql
  • (mem)缓存你的结果(e.q.::pseudocode :: md5(sql_string)= sql_result)。
  • 创建一个包含5个索引整数列(年,月,日,小时,分钟)的中间表。在主sql提取之前,检查此表以获取所需的数据(查询应该非常快)。如果不存在任何东西,那就制作你的魔法"事务(最好不要使用Django的ORM)。结果将其用于您的目的,但也将其复制到您的辅助表中。
  • 当你厌倦了做不必要的操作时,根据项目需要消耗一些睡眠时间并优化你的sql结构:需要什么数据,db写入量与db读取量,内部/外部连接等等...
相关问题