Сделать набор запросов с несколькими диапазонами дат - PullRequest
0 голосов
/ 01 декабря 2011

У меня есть какое-то поле даты в модели, и мне нужно, чтобы агрегировать количество строк в модели по диапазону дат.У меня есть, на примере - date1, date2, date3, date4, date5 Я могу получить номера строк для любого диапазона:

number1 = Model.objects.filter(date__range=(date1, date2)).aggregate(Count('id'))
number2 = Model.objects.filter(date__range=(date2, date3)).aggregate(Count('id'))
....

Затем мне нужно объединить эти под номера в один набор запросов.Я знаю, что я могу использовать: номер1 |номер2 |... или itertooks.chain, но мне нужен набор запросов, а не список или что-то еще.

Что бы вы мне предложили?

Дополнительная информация: Спасибо за ваши ответы.Но, похоже, я не был достаточно ясен.Что мне нужно, чтобы получить что-то вроде этого: 2 поля, диапазон данных и число.Кажется, невозможно получить номер записи в пределах интервала дат, используя объект Q.Мне удалось получить его с этим простым SQl:

sql1 = "Select COUNT(*) as count from table where date_created BETWEEN date1 and date2".

После того, как я использовал QuerySet extra:

qs=qs.extra(select={'number1': sql1, 'number2':sql2 ...}).

Итак, я получил набор запросов с полями number1, number2, .. и связанными с нимиценности.Но я хотел получить 2 поля:

data_range, number
range1, number1
range1, number1

и иметь много строк с данными.Я думаю, что я могу получить его с помощью запроса SQL с помощью UNION: SQL1 UNION sql2 UNION sql3 .. Кажется, это невозможно с Django ORM, но, возможно, я ошибаюсь?

1 Ответ

3 голосов
/ 01 декабря 2011

Использование Q объектов :

Быстрый и грязный пример будет примерно таким:

from django.db.models import Q

number1 = Model.objects.filter(Q(date__range=(date1, date2) | Q(date__range=(date3, date4))

Это вернет набор запросов, где даты находятся между date1 и date2 или между date3 и date4.

Я также думаю , что вы хотите annotate, а не aggregate. annotate задокументировано здесь . Мне немного непонятно в этом вопросе из твоего вопроса.

В любом случае, принципиально, вам нужно решение Q объектов.

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