Django 查询 - 如何按日期过滤总和?

Posted

技术标签:

【中文标题】Django 查询 - 如何按日期过滤总和?【英文标题】:Django query - how to filter sum by date? 【发布时间】:2021-11-26 18:31:03 【问题描述】:

我正在努力处理 Django 视图中的查询集。基本上,我有三个模型:User、ActivityLog 和 ActivityCategory。

用户是内置的。

ActivityLog 如下所示:

class ActivityLog(models.Model):
    activity_datetime = models.DateTimeField(default=timezone.now)
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, related_name='activity_user')
    activity_category = models.ForeignKey(ActivityCategory, on_delete=models.CASCADE, null=True, related_name='activity_cat')
    activity_description = models.CharField(max_length=100, default="Misc Activity")

活动类别:

class ActivityCategory(models.Model):
    activity_name = models.CharField(max_length=40)
    activity_description = models.CharField(max_length=150)
    pts = models.IntegerField()

我的目标是按用户返回他们通过参与日志中的活动积累的所有积分的汇总。每个日志引用一个ActivityType,不同的类型值不同的分数。

我通过视图中的以下查询完成了此操作:

class UserScoresAPIView(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserScoresSerializer

    def get_queryset(self):
        queryset = User.objects.annotate(total_pts=Coalesce(Sum('activity_user__activity_category__pts'), 0)).order_by('-total_pts')
        return queryset

所以现在我需要添加到此查询并根据活动日期对其进行限制。我想基本上添加一个过滤器:

.filter('activity_user__activity_datetime__gte=datetime.date(2020,10,1)') 

如何将其添加到我当前的查询中以完成此操作?我在这里尝试这样做:

queryset = User.objects.annotate(total_pts=Coalesce(Sum('activity_user__activity_category__pts').filter('activity_user__activity_datetime__gte=datetime.date(2020,10,1)') , 0)).order_by('-total_pts')

但这会发生在 Sum 之后并且不会有帮助(或工作......)所以我尝试将它链接到它正在拉用户对象的位置​

User.objects.filter('activity_user__activity_datetime__gte=datetime.date(2020,10,1)').annotate(total_pts=Coalesce(Sum('activity_user__activity_category__pts'), 0)).order_by('-total_pts')

但现在我在尝试解析查询时收到错误消息:

ValueError: too many values to unpack (expected 2)

我不知道下一步该去哪里,感谢任何指导。

谢谢。

BCBB

【问题讨论】:

【参考方案1】:

啊啊啊我太专注于如何将这些链接在一起,以至于我认为我做错了,但实际上,我只是不确定是什么让我将过滤器括在引号中......

啊。它现在可以在最后列出的没有引号的情况下工作......

User.objects.filter(activity_user__activity_datetime__gte=datetime.date(2020,10,1)).annotate(total_pts=Coalesce(Sum('activity_user__activity_category__pts'), 0)).order_by('-total_pts')

【讨论】:

以上是关于Django 查询 - 如何按日期过滤总和?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 中按日期范围过滤记录?

django-rest-framework 按日期过滤=无

Django QuerySet 是不是使用二进制搜索按日期过滤?

Django - 如何使用 Django Rest Framework 按日期过滤?

Django按日期范围过滤但不包括年份

如何按 Django-filter 包中的日期字段进行过滤?