Django создать представление дб с умножением между столбцами, взять среднее и сгруппировать по времени - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть django модель, как показано ниже:

class Source(models.Model):
    date = models.DateTimeField(primary_key=True,
                                auto_now_add=True)
    curr_1 = models.DecimalField(decimal_places=2)
    volt_1 = models.DecimalField(decimal_places=2)
    curr_2 = models.DecimalField(decimal_places=2)
    volt_2 = models.DecimalField(decimal_places=2)
    curr_3 = models.DecimalField(decimal_places=2)
    volt_3 = models.DecimalField(decimal_places=2)

class AvgPower(models.Model):
    ...

Теперь я хочу создать представление БД для вышеуказанной группы таблиц по дням с помощью столбцов, как показано ниже:

power_1 = avg(curr_1 * volt_1)
power_2 = avg(curr_2 * volt_2)
power_3 = avg(curr_3 * volt_3)

Может ли кто-нибудь сказать мне, как создать представление с "group by", умножить и усреднить по времени?

======================= ================================================

Часть ответа:

Source.objects
.filter(time_r__date__gte=(date.today()-timedelta(days=1)))
.annotate(p1=F('curr_1')*F('volt_1'),p2=F('curr_2')*F('volt_2'))
.values('time_r__date')
.annotate(p1a=Avg('p1'),p2a=Avg('p2'))

, где

time_r__date: извлечение даты из поля даты и времени

time_r__date__gte: больше или равно

(date.today()-timedelta(days=1)): оба с datetime, получить вчерашнюю дату

annotate(p1=F('curr_1')*F('volt_1'),p2=F('curr_2')*F('volt_2')): вычислить pow от curr и вольт для каждой строки

values('time_r__date'): сгруппировать по time_r__date

annotate(p1a=Avg('p1'),p2a=Avg('p2')): получить среднее значение для каждой группы

1 Ответ

0 голосов
/ 06 апреля 2020

Вы можете использовать выражение F () с аннотацией и агрегированием. Source.objects.filter (день = 1) .annotate (power_sum = F ('curr_1') * F ('volt_1'), power_sum2 = F ('curr_2') * F ('volt_2')) .aggregate (Avg ( 'power_sum'), Avg ( 'power_sum2'))

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