You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于登录用户的好友过滤排行榜数据?

好友XP排行榜数据过滤实现方案

你的需求是将全用户排行榜改为仅展示当前登录用户的好友数据,无需循环好友列表,直接通过ORM的__in查询即可高效实现。

修改后的视图代码

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):
        # 获取当前登录用户的好友列表
        friends = self.request.user.friends
        # 过滤出好友当日的XP记录,聚合排序取前20
        return queryset.filter(
            created_at__date=timezone.now().date(),
            user__in=friends
        ).values('user_id', 'user', 'day_streak') \
         .annotate(xp_val=Sum('xp_value')) \
         .order_by('-xp_val')[:20]

关键修改点说明

  1. 好友过滤:添加user__in=friends条件,直接筛选出属于好友的UserLeaderboardTracking记录,避免循环遍历的低效操作。
  2. 日期处理:将timezone.now()改为timezone.now().date(),确保严格匹配当日日期(原代码中created_at__date需要传入date对象,显式转换逻辑更清晰)。
  3. 规范使用queryset:替换原代码中的self.queryset为方法参数queryset,遵循DRF视图规范,确保queryset经过视图默认的权限、分页等逻辑处理后,再执行自定义过滤。

补充说明

  • 确保self.request.user.friends返回的是有效的User对象集合(如果是ManyToMany字段可直接使用;如果是自定义方法,需返回可用于__in查询的QuerySet或ID列表)。
  • 若好友列表为空,查询会返回空结果集,前端可针对性做友好提示。

内容的提问来源于stack exchange,提问作者Riccardo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 15:45:42