Как получить простую сводную таблицу, используя django orm? - PullRequest
0 голосов
/ 23 января 2020

Простая модель с 3 столбцами данных.

ввод:

id  ts  val var
1   1   1   10
2   2   2   20
3   2   3   30
4   1   4   40
5   1   5   50
6   2   6   60

вывод:

ts  val     var
1   [1,4,5] [10,40,50]
2   [2,3,6] [20,30,60]
AND
ts  val_var
1   [1,10]  [4,40]  [5,50]
2   [2,20]  [3,30]  [6,60]

Что следует использовать: annotate () aggregate () group_by ()?

Или еще более простая сводная таблица:

ts  val
1   [1,4,5]
2   [2,3,6]

1 Ответ

0 голосов
/ 23 января 2020

Я бы подумал, перебрать правильно упорядоченный набор запросов. Использование yield для создания генератора эффективно, если набор запросов огромен, в отличие от создания огромного списка и последующей его обработки.

NB Не проверено.

def foo1():    

    qs = Whatever.objects.all().order_by( 'ts', 'val')
    vals, vars = [],[]
    for obj in qs:

         if vals and obj.ts != ts:
              yield ts, vals, vars
              vals, vars = [], []

         ts = obj.ts
         vals.append( obj.val)
         vars.append( obj.var)

    yield ts, vals, vars # don't forget the last one

Использование:

for ts, val, var in foo1():
     print ( ts, val, var)   

Для второго вы просто используете zip для результатов:

     print ( ts, *[ x for x in zip( val, var) ]) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...