Django вычислить разницу между строками в ORM - PullRequest
0 голосов
/ 27 мая 2020

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

Например, если у меня есть такая модель, как:

class DailyUsers(model.Model):
  date = models.DateField()
  users = models.IntegerField()

И я делаю следующую аннотацию:

queryset = models.DailyUsers.annotate(
  unique_users=Window(
    UnionAggCardinality(F("users")),
    order_by=F("date").asc(),
  )
).values("date", "unique_users")
>> [
     {"date": "2020-01-01", "users": 10}
     {"date": "2020-01-02", "users": 10}
     {"date": "2020-01-03", "users": 20}
     {"date": "2020-01-04", "users": 20}
     {"date": "2020-01-05", "users": 21}
   ]

Затем мне нужно выполнить следующий расчет:

queryset = list(queryset)
result_list = [obj["result"] for obj in queryset]
for i in range(1, len(queryset)):
  queryset[i]["result"] = result_list[i] - result_list[i-1]
>> [ 
     {"date": "2020-01-01", "users": 10}
     {"date": "2020-01-02", "users": 0}
     {"date": "2020-01-03", "users": 10}
     {"date": "2020-01-04", "users": 0}
     {"date": "2020-01-05", "users": 11}
   ]

Вычисление по существу вычитает пользователей предыдущих дней из текущего дня для нового значения (пропуская первый день).

Есть ли способ сделать это в орме? В идеале я бы использовал функцию Window Lag, но вы не можете вкладывать оконные функции.

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