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



我正在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

我非常专注于如何将这些链接在一起,我认为我做错了,但实际上,我只是不确定是什么让我把过滤器括起来…

Arrrrg。

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')