У меня есть 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'))
: получить среднее значение для каждой группы