Как сделать аналитику лайков от одного временного периода к другому

Аналитика о том, сколько лайков было сделано. 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'))

Вернуться на верх