基于时间间隔的数据库调度过滤器

时间:2009-11-17 11:07:16

标签: python django filter

让我们进行一项名为Weather的科学实验,它记录有关天气的一般信息,其中一个是每分钟记录humidity。比如说10个小时后,您将存储600个数据库值。

Weather.objects.filter().exclude(time__lt = commence).exclude(time__gt = cease)

这会在Weathercommence次之间为cease表创建一个过滤器。

假设时间标准等于现在的-4小时,因此它将返回最后4小时的数据,其等于300个值。我怎么要求间隔10?意思是,从这300个值中,我将如何获得每个值的第10个,所以10,20,30,40 ...... 280,290,300 ......这意味着从过滤器返回30个值。

编辑:

是否可以要求间隔10秒?而不是每个人的第10个值..

1 个答案:

答案 0 :(得分:2)

SQL没有办法要求每十分之一,所以ORM通常不会给你一种表达这种需求的方法。你可以在Python中完成这项工作:

samples = list(Weather.objects.filter().exclude(time__lt=commence).exclude(time__gt=cease))
for s10 in samples[::10]:
    # do something with every tenth...

这将在一个查询中从数据库中提取所有样本,然后仅使用其中的10%。你也可以只提取你需要的那个,一个用于查询:

sample_count = 600 # Somehow determine how many samples are in your time window.
samples = Weather.objects.filter().exclude(time__lt=commence).exclude(time__gt=cease)
for s_num in range(0, sample_count, 10):
    s = samples[s_num]
    # Now you have one sample in s.

详细说明:range有三个参数,start,stop和step。例如:

>>> range(0, 100, 10)
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

在第二个示例中,范围表达式用于创建我们想要的样本的索引值。然后samples[s_num]评估QuerySet以从数据库中获取该值。