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
相关产品推荐
相关产品推荐

