2014-09-03 3 views
1

Я создаю сайт для целей наставничества. При этом из наставников поступают журналы о том, как прошла встреча с его попечителем (ами). В рамках панели инструментов я подвергаю/вычисляя и обнажая требуемые данные.Django custom aggregation

Заявление о проблемах: Узнайте среднюю частоту, с которой журналы вошли в коллекцию наставников.

Мой подход:

Шаг 1. Вычислить среднюю частоту, т.е. среднего значения разницы между двумя немедленно происходящими бревнами для каждого наставничества.

Шаг 2. Вычислить среднее из средних частот для каждого наставничества, который вычисляется на шаге 1.

Я знаю, что я буду нуждаться в группу журналов по наставничеству, а затем передать его в обычай агрегированную функцию, которая будет выполнять шаги 1 и 2. Как это сделать в Django? Может кто-то, пожалуйста, помогите мне с проблемой? Заранее спасибо.

ответ

0

На первом месте вам нужно знать где расчеты должны быть выполнены. Это два возможных места, каждый из которых имеет плюсы и минусы.

Первое место, где нужно делать расчеты, находится в уровне базы данных. К сожалению, у вас нет в django функций для написания запроса изначально. Тогда вам нужен raw query. Также вам нужна СУБД с аналитической поддержкой:

sql = """  
    with table_with_predates as (
     SELECT Id, 
      some_date, 
      lag(some_date) pre_date 
     FROM menthors 
     WINDOW client_window as (partition by client order by idMenthor) 
    ) select Id, avg(some_date - pre_date) as data_average 
     from table_with_predates 
     group by Id  
    """ 
menthors = Menthor.objects.raw(sql) 
print ('Menthor average', menthors[0].name, menthors[0].data_average) 

Второй шаг может быть выполнен с использованием специального sql. из этого легко можно сделать вывод.

Второе место, где нужно делать расчеты, находится в слой приложения. Получите время регистрации от модели и выполните среднее значение в python:

log_times = (Log 
       .objects 
       .filter(menthor = some_menthor) 
       .values_list('some_date', flat=True) 
      ) 
menthor_average_log = reduce(lambda x, y: x + y, log_times)/len(log_times) 

У вас есть материал, чтобы начать код. Наслаждаться.