Фильтр планирования для базы данных с интервалом времени - PullRequest
1 голос
/ 17 ноября 2009

Давайте проведем научный эксперимент под названием Weather, в котором будет записана общая информация о погоде, одна из которых - запись humidity каждую минуту. Через 10 часов вы сохраните 600 значений базы данных.

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

Это создаст фильтр для таблицы Weather, от commence до cease раз.

Скажем, временной критерий равен -4 часам от настоящего, поэтому он вернет данные за последние 4 часа, которые равны 300 значениям. Как бы я попросить интервал 10? То есть, из этих 300 значений, как бы я получил 10-е из каждого, поэтому 10, 20, 30, 40 ... 280, 290, 300 ... что означало бы, что 30 значений возвращаются из фильтра.

EDIT:

Можно ли попросить интервал, скажем, 10 секунд? В отличие от каждого отдельного 10-го значения ..

1 Ответ

2 голосов
/ 17 ноября 2009

В 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, чтобы получить только это одно значение из базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...