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

Django 2.0中外键过滤:筛选当前登录用户关注者发布的帖子

嘿,要实现只展示当前登录用户关注的人的帖子,咱们可以这么一步步来:

第一步:添加关注关系模型

首先,咱们得有个模型来记录用户之间的关注关系,因为你的ProfileDetails里没这块内容。创建一个Follow模型,这样就能追踪谁关注了谁:

class Follow(models.Model):
    follower = models.ForeignKey(User, on_delete=models.CASCADE, related_name='following')
    following = models.ForeignKey(User, on_delete=models.CASCADE, related_name='followers')
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        unique_together = ('follower', 'following')  # 防止同一用户重复关注同一个人

这里的related_name很关键,它让我们能通过request.user.following快速获取当前用户关注的所有对象,反过来request.user.followers能获取关注当前用户的人。

第二步:确保帖子模型关联用户

假设你的帖子模型(比如叫Post)是关联到User的,大概长这样:

class Post(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    # 其他你需要的字段,比如标题、图片之类的

如果你的帖子是关联到ProfileDetails的,后面筛选逻辑我会单独说明。

第三步:在视图中筛选帖子

接下来就是核心的筛选逻辑了,分两种视图类型来说:

函数视图版本

用login_required确保只有登录用户能访问这个页面,然后获取当前用户关注的所有用户ID,再过滤帖子的作者在这个列表里:

from django.contrib.auth.decorators import login_required
from django.shortcuts import render
from .models import Post, Follow
from django.db.models import Q

@login_required
def followed_posts(request):
    # 获取当前用户关注的所有用户的ID列表
    followed_user_ids = request.user.following.values_list('following__id', flat=True)
    
    # 筛选帖子:作者是关注的用户,如果你想包含自己的帖子,就加上 | Q(author=request.user)
    posts = Post.objects.filter(
        author_id__in=followed_user_ids
        # 要是想显示自己的帖子,就打开下面这行注释
        # | Q(author=request.user)
    ).order_by('-created_at')  # 按发布时间倒序,最新的在前
    
    return render(request, 'your_template.html', {'posts': posts})

类视图(ListView)版本

如果你用的是Django的类视图,那就继承LoginRequiredMixin和ListView,然后重写get_queryset方法来实现筛选:

from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import ListView
from .models import Post, Follow
from django.db.models import Q

class FollowedPostsView(LoginRequiredMixin, ListView):
    model = Post
    template_name = 'your_template.html'
    context_object_name = 'posts'
    ordering = ['-created_at']  # 默认按时间倒序

    def get_queryset(self):
        # 获取当前用户关注的用户ID
        followed_user_ids = self.request.user.following.values_list('following__id', flat=True)
        
        # 筛选帖子,同样可以选择是否包含自己的
        queryset = super().get_queryset().filter(
            author_id__in=followed_user_ids
            # | Q(author=self.request.user)
        )
        return queryset
如果帖子关联的是ProfileDetails怎么办?

要是你的Post模型的author字段是关联到ProfileDetails的,那筛选逻辑要调整一下:

# 函数视图里的筛选部分
followed_user_ids = request.user.following.values_list('following__id', flat=True)
# 先获取关注用户对应的ProfileDetails
followed_profiles = ProfileDetails.objects.filter(user_id__in=followed_user_ids)
# 再筛选帖子的作者在这些Profile里
posts = Post.objects.filter(author__in=followed_profiles)

最后别忘了迁移数据库,把Follow模型同步到数据库里:

python manage.py makemigrations
python manage.py migrate

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:20:39