Как фильтровать на основе друзей вошедшего пользователя?
Я делаю таблицу лидеров, которая работает при фильтрации по всем пользователям. Но здесь я хотел бы фильтровать на основе друзей пользователя.
Вот как я получаю список друзей :
users = self.request.user.friends
и это мое мнение :
class FriendsDayLeaderBoard(ListAPIView):
"""
List friends Leaderboard based on XP token by Day
Get request
"""
serializer_class = UserLeaderboardSerializer
queryset = UserLeaderboardTracking.objects.all()
permission_classes = [IsAuthenticated]
def filter_queryset(self,queryset):
users = self.request.user.friends
return self.queryset.filter(created_at__date=timezone.now()) \
.values('user_id', 'user', 'day_streak') \
.annotate(xp_val=Sum('xp_value')) \
.order_by('-xp_val')[:20] \
UserLeaderboardTracking отслеживает всех пользователей в приложении каждый раз, когда они зарабатывают xp
пробовал зациклить из списка друзей, но не уверен, как действовать в этом направлении
Моя модель:
class UserLeaderboardTracking(models.Model):
user = models.ForeignKey(to=User, related_name='user_leaderboard', on_delete=models.CASCADE, null=True)
xp_value = models.PositiveIntegerField(null=True, blank=True)
day_streak = models.PositiveIntegerField(null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
Если вы хотите фильтровать UserLeaderBoardTracking только для друзей текущего пользователя, если я правильно понял ваш пост, вы можете сделать так:
class FriendsDayLeaderBoard(ListAPIView):
"""
List friends Leaderboard based on XP token by Day
Get request
"""
serializer_class = UserLeaderboardSerializer
queryset = UserLeaderboardTracking.objects.all()
permission_classes = [IsAuthenticated]
def filter_queryset(self,queryset):
users = self.request.user.friends
queryset = queryset.filter(created_at__date=timezone.now())
queryset = queryset.filter(user__in=users)
queryset = queryset.values('user_id', 'user', 'day_streak')
queryset = queryset.annotate(xp_val=Sum('xp_value'))
queryset = queryset.order_by('-xp_val')[:20]
return queryset