Аннотация кумулятивных сумм полей в запросе - PullRequest
0 голосов
/ 23 февраля 2020

У меня есть модель, которая записывает данные о том, когда пользователь смотрел видео:

class VideoViewed(models.Model):
    user = models.ForeignKey(Employee, on_delete=models.CASCADE)
    video = models.ForeignKey(Video, on_delete=models.CASCADE)
    date_time = models.DateTimeField(default=timezone.now)

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

В настоящее время у меня есть эта аннотация:

queryset = queryset.annotate(
    user_views_cumsum=Window(Sum('video'),
                             order_by=F('date_time').asc()))\
    .values('user', 'video', 'date_time', 'id', 'user_views_cumsum').order_by('date_time', 'user_views_cumsum')

, которую я хочу дать Queryset:

<QuerySet [

{'user': 2, 'video': 13, 'date_time': datetime, 'id': 5, 'user_views_cumsum': 1}, 
{'user': 2, 'video': 13, 'date_time': datetime, 'id': 6, 'user_views_cumsum': 2}, 
{'user': 4, 'video': 13, 'date_time': datetime, 'id': 7, 'user_views_cumsum': 1},
{'user': 2, 'video': 13, 'date_time': datetime, 'id': 8, 'user_views_cumsum': 3},
{'user': 2, 'video': 13, 'date_time': datetime, 'id': 9, 'user_views_cumsum': 4}, 
{'user': 4, 'video': 13, 'date_time': datetime, 'id': 10, 'user_views_cumsum': 2}

]>

Но дает мне сумму идентификатора видео, так что выглядит так:

<QuerySet [

{'user': 2, 'video': 13, 'date_time': datetime, 'id': 5, 'user_views_cumsum': 13}, 
{'user': 2, 'video': 13, 'date_time': datetime, 'id': 6, 'user_views_cumsum': 26}, 
{'user': 4, 'video': 13, 'date_time': datetime, 'id': 7, 'user_views_cumsum': 39},
{'user': 2, 'video': 13, 'date_time': datetime, 'id': 8, 'user_views_cumsum': 52},
{'user': 2, 'video': 13, 'date_time': datetime, 'id': 9, 'user_views_cumsum': 65}, 
{'user': 4, 'video': 13, 'date_time': datetime, 'id': 10, 'user_views_cumsum': 78}

]>

Есть 2 проблемы. Мне нужно отделить user_views_cumsum, чтобы он составлял только просмотров видео каждого пользователя , и мне нужно добавить cumsum просмотров видео каждого пользователя вместо id.

Мысли?

1 Ответ

1 голос
/ 23 февраля 2020

Вы можете использовать Count() вместо Sum(), поэтому каждый просмотр будет учитываться только один раз.

Как вы, вероятно, знаете, как реляционные базы данных хранят данные этого типа, используют внешние ключи. При вызове Sum('video') вы запрашиваете сумму столбца с именем video, который содержит id видео. Вот почему вы получаете сумму идентификаторов. Однако вам не важно значение любого столбца, поэтому вы можете использовать count.

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