时间段内每天的点赞总数



我正在Django RF上构建一个REST API,它代表了一个非常基本的社交网络。我有一个模型帖子,它有一个值 喜欢 通过喜欢模型与用户相关。我的模型:

class Post(models.Model):
content = models.TextField()
created_on = models.DateTimeField(auto_now_add=True)
author = models.ForeignKey(CustomUser, on_delete=models.CASCADE,
related_name='posts')
likes = models.ManyToManyField(CustomUser,
related_name='likes',
through='Like')
class Like(models.Model):
author = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
post = models.ForeignKey(Post, on_delete=models.CASCADE)
liked_on = models.DateTimeField(auto_now_add=True)

我需要汇总给定时间段内每天的喜欢统计信息。例如,请求如下所示 分析/?date_from=2020-05-15&date_to=2020-05-17

我需要给出这样的东西:

[{
'date': 2020-05-15,
'likes': 5,
}, {
'date': 2020-05-16,
'likes': 7,
}, {
'date': 2020-05-17,
'likes': 10,
}]

我怎样才能在 Django 中做到这一点?我是否应该查询仅将喜欢作为列表的帖子模型?还是喜欢模特?应该是什么查询?

你应该使用 Django-Filter。然后在筛选器类中,添加以下筛选器:

date_from = filters.DateTimeFilter(field_name='liked_on', lookup_expr='gte')
date_to = filters.DateTimeFilter(field_name='liked_on', lookup_expr='lte')

然后,您可以按照指定的方式提出请求,但使用日期时间而不是日期。可以将筛选器类添加到 LikesView 中。

更新:聚合

要添加聚合,请在调用self.filter_queryset()后在视图中执行此操作:

Like.objects.extra(select={'date': "date(<app_name>_like.liked_on)"}).annotate(likes=Count('pk')).order_by('-liked_on')

不要忘记将<app_name>替换为应用程序的名称并导入django.db.models.Count

这是受到这个问题的答案的启发。

现在你可以有一个序列化程序,其中包含字段datelikes

class LikeByDaySerializer(serializers.ModelSerializer):
date = serilaizers.DateTimeField()
likes = serializers.IntegerField()
class Meta:
model = Like
fields = ('date', 'likes')

最新更新