Как фильтровать на основе друзей вошедшего пользователя?

Я делаю таблицу лидеров, которая работает при фильтрации по всем пользователям. Но здесь я хотел бы фильтровать на основе друзей пользователя.

Вот как я получаю список друзей :

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
Вернуться на верх