Как сделать аналитику лайков от одного временного периода к другому
Аналитика о том, сколько лайков было сделано. Example url/api/analitics/?date_from=2021-03-03 &date_to=2021-03-20. API должен возвращать аналитику, агрегированную по дням.
models.py
class Like(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='likes', null=True, blank=True)
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, null=True, blank=True)
object_id = models.PositiveIntegerField(default=0, null=True, blank=True)
content_object = GenericForeignKey('content_type', 'object_id')
date = models.DateTimeField(verbose_name='Дата создания', auto_now_add=True, null=True, blank=True)
#date_from = django_filters.DateTimeFilter(field_name='date', lookup_expr='gte')
#date_to = django_filters.DateTimeFilter(field_name='date', lookup_expr='lte')
@property
def day(self):
return self.date.count()
serializers.py
class LikesSerializer(serializers.ModelSerializer):
#days_since_joined = serializers.SerializerMethodField()
date = serializers.DateTimeField()
likes = serializers.IntegerField()
class Meta:
model = models.Like
fields = ('date', 'likes')#, 'days_since_joined')
views.py
class LikesView(ModelViewSet):
queryset = models.Like.objects.extra(select={'date': "
date(posts_like.date)"}).annotate(likes=Count('pk')).order_by('-date')
serializer_class = serializers.LikesSerializer
вывод
[
{
"date": "2022-01-05",
"likes": 1
},
{
"date": "2022-01-05",
"likes": 1
},
{
"date": "2022-01-05",
"likes": 1
}
]
Но необходимо, чтобы все 3 лайка суммировались в 1 и так далее от разных пользователей
[
{
"date": "2022-01-05",
"likes": 3
},
]
Вам необходимо использовать функции trunc для измельчения даты и сгруппировать их по уникальной дате, как описано здесь .
Пример:
queryset = Like.objects .order_by(TruncDay('date')).annotate(day=TruncDay('date')).values('day').annotate(likes=Count('object_id', 'content_type'))