You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动