Я пытаюсь избежать потенциально дорогостоящих вычислений, которые я делаю после получения набора запросов, но делаю это во время запроса, но я не уверен, возможно ли это.
Например, если у меня есть такая модель, как:
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
, но вы не можете вкладывать оконные функции.