Django中如何获取共同好友(互关用户)?
Django中如何获取共同好友(互关用户)?
看起来你已经在Django的关注/粉丝功能上有不少进展啦,不过在获取共同好友这块卡壳了对吧?我来帮你梳理下问题出在哪,再给你调整代码~
首先得明确你要的是哪种“共同好友”:是和你双向互关的用户,还是你和另一个特定用户共同关注的好友?这两种场景的实现逻辑不一样,我分别给你讲:
问题出在哪?
你现在写的代码只是把当前用户关注的所有人查出来了,完全没做“交集”或者“双向关注”的筛选,所以自然看不到真正的“共同”部分。比如这段:
all_following = request.user.profile.following.values_list('pk', flat=True) mutual_followers = Profile.objects.filter(pk__in=all_following)
它的作用只是拿到你关注的所有用户,和“共同好友”完全不沾边哦。
场景1:获取和当前用户互关的用户(双向关注)
也就是你关注的人里,同时也关注你的用户。调整代码如下:
def FollowingView(request): page_title = "Following" # 你的其他原有代码 posts = Post.objects.filter( Q(poster_profile=request.user)| Q(poster_profile__profile__followers__user=request.user) ).order_by("?").distinct() profile_users = Profile.objects.exclude(Q(user=request.user)) # 获取互关用户的正确写法 # 第一步:拿到我关注的所有人的ID列表 my_following_ids = request.user.profile.following.values_list('pk', flat=True) # 第二步:筛选出那些既在我关注列表里,又关注了我的用户 mutual_followers = Profile.objects.filter( pk__in=my_following_ids, followers__user=request.user # 这个条件确保对方也关注了我 ).distinct() # 把mutual_followers传到模板里即可 return render(request, 'your_template.html', { 'page_title': page_title, 'posts': posts, 'profile_users': profile_users, 'mutual_followers': mutual_followers })
场景2:获取当前用户和某个特定用户的共同好友
比如你想找你和用户X都关注的人,代码可以这么写:
def FollowingView(request): page_title = "Following" # 假设你从URL参数或其他渠道拿到目标用户ID target_user_id = request.GET.get('target_user_id') target_profile = Profile.objects.get(user_id=target_user_id) # 你的其他原有代码 posts = Post.objects.filter( Q(poster_profile=request.user)| Q(poster_profile__profile__followers__user=request.user) ).order_by("?").distinct() profile_users = Profile.objects.exclude(Q(user=request.user)) # 获取共同关注的用户 my_following_ids = request.user.profile.following.values_list('pk', flat=True) target_following_ids = target_profile.following.values_list('pk', flat=True) # 取两个列表的交集,就是共同关注的用户 mutual_friends = Profile.objects.filter( pk__in=my_following_ids, pk__in=target_following_ids ).distinct() return render(request, 'your_template.html', { # 其他变量... 'mutual_friends': mutual_friends })
小提示
- 记得用
.distinct()去重,避免因为多对多关系出现重复的用户条目 - 如果你的“共同好友”定义是两个用户共同的粉丝,那只需要把
following换成followers就行,逻辑是完全一致的
内容来源于stack exchange




