Django中如何通过关联模型查询关注用户发布的Post内容
问题原因
- 模型反向关联名语义混淆
你当前Follow模型的related_name设置逻辑颠倒:
follower字段的related_name="follower":表示通过User.follower可以拿到该用户作为关注者的所有Follow记录(也就是这个用户关注了别人的记录)following字段的related_name="following":表示通过User.following可以拿到该用户作为被关注者的所有Follow记录(也就是别人关注这个用户的记录)
你在视图里调用user.following.all()本来想拿该用户关注的人的记录,实际拿到的是别人关注该用户的记录,逻辑完全颠倒。
- 视图查询逻辑错误
user.following.all()返回的是Follow对象的查询集,你直接对查询集调用.following属性,自然会触发QuerySet没有following属性的报错。
解决方法
推荐方案:先调整模型反向关联名(语义更清晰,避免后续踩坑)
修改Follow模型的related_name设置,让命名和实际语义匹配:
class Follow(models.Model): follower = models.ForeignKey( User, on_delete=models.PROTECT, related_name="following_records") following = models.ForeignKey( User, on_delete=models.PROTECT, related_name='follower_records')
调整后语义:
user.following_records:拿到该用户作为关注者的所有Follow记录(该用户关注了别人的记录)user.follower_records:拿到该用户作为被关注者的所有Follow记录(别人关注该用户的记录)
对应修改视图代码即可:
def following_page(request, username): user = User.objects.get(username=username) # 提取该用户关注的所有用户的ID列表 following_users = user.following_records.values_list('following_id', flat=True) # 过滤出这些用户发布的帖子,按发布时间倒序 posts = Post.objects.filter(poster_id__in=following_users).order_by("-date_created") return render(request, 'network/index.html', { "posts": posts })
不修改模型的临时方案
如果你不想改动模型定义,也可以直接基于现有反向关联名调整视图查询逻辑,注意现有配置下user.follower才是该用户作为关注者的Follow记录:
def following_page(request, username): user = User.objects.get(username=username) following_users = user.follower.values_list('following_id', flat=True) posts = Post.objects.filter(poster_id__in=following_users).order_by("-date_created") return render(request, 'network/index.html', { "posts": posts })
内容的提问来源于stack exchange,提问作者Omayer Hasan
相关产品推荐
相关产品推荐

