一段时间内每天的总点赞数
Aggregate number of likes for each day within period
我正在 Django RF 上构建一个 REST Api,它代表一个非常基本的社交网络。我有一个模型 Post,它有一个值 Likes,它通过 Like 模型与 User 相关联。我的模型:
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)
我需要汇总给定时间段内每一天的点赞统计数据。例如,请求看起来像这样 analytics/?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 中做到这一点?我应该查询一个 Post 模型,它只是一个列表吗?或者喜欢模特?查询应该是什么?
你应该使用 Django-Filter。然后在过滤器 class 中,添加以下过滤器:
date_from = filters.DateTimeFilter(field_name='liked_on', lookup_expr='gte')
date_to = filters.DateTimeFilter(field_name='liked_on', lookup_expr='lte')
然后您可以按照您指定的方式提出请求,但使用的是日期时间而不是日期。过滤器 class 可以添加到 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
.
这是受到 this question 的启发。
现在您可以拥有一个包含字段 date
和 likes
:
的序列化程序
class LikeByDaySerializer(serializers.ModelSerializer):
date = serilaizers.DateTimeField()
likes = serializers.IntegerField()
class Meta:
model = Like
fields = ('date', 'likes')
我正在 Django RF 上构建一个 REST Api,它代表一个非常基本的社交网络。我有一个模型 Post,它有一个值 Likes,它通过 Like 模型与 User 相关联。我的模型:
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)
我需要汇总给定时间段内每一天的点赞统计数据。例如,请求看起来像这样 analytics/?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 中做到这一点?我应该查询一个 Post 模型,它只是一个列表吗?或者喜欢模特?查询应该是什么?
你应该使用 Django-Filter。然后在过滤器 class 中,添加以下过滤器:
date_from = filters.DateTimeFilter(field_name='liked_on', lookup_expr='gte')
date_to = filters.DateTimeFilter(field_name='liked_on', lookup_expr='lte')
然后您可以按照您指定的方式提出请求,但使用的是日期时间而不是日期。过滤器 class 可以添加到 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
.
这是受到 this question 的启发。
现在您可以拥有一个包含字段 date
和 likes
:
class LikeByDaySerializer(serializers.ModelSerializer):
date = serilaizers.DateTimeField()
likes = serializers.IntegerField()
class Meta:
model = Like
fields = ('date', 'likes')