Django запрос - как отфильтровать сумму по дате?
Я борюсь с кверисетом в представлении 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
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')