【问题标题】:Django query - how to filter sum by date?Django 查询 - 如何按日期过滤总和?
【发布时间】: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

【问题讨论】:

    标签: django django-views django-orm


    【解决方案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')
    

    【讨论】:

      猜你喜欢
      • 2013-08-16
      • 2016-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 2014-03-10
      相关资源
      最近更新 更多