Django FieldError求助:无法解析'user'字段,Post模型用Author
解决Django接口的FieldError及Follow逻辑问题
看起来你遇到了两个核心问题:一是Post查询时的字段错误,二是Follow模型反向查询的逻辑混淆,还有对request.user的疑问。我来一步步帮你解决:
1. 直接解决FieldError:替换查询字段
你的Post模型用的是author字段关联用户,但视图里查询Post时写了user__id__in,Django自然找不到user这个字段,所以抛出FieldError。
把视图里的查询语句修改为:
# 原错误代码 # queryset = Post.objects.filter(user__id__in=followed_users_id).order_by("-date_posted") # 修改后 queryset = Post.objects.filter(author__id__in=followed_users_id).order_by("-date_posted")
2. 修正Follow模型的反向查询逻辑(关键!)
你的Follow模型的related_name设置得非常容易混淆,导致你获取"关注的用户ID"的逻辑完全反了:
- 当前Follow模型中,
user字段的related_name='user'、follow_user字段的related_name='follow_user',反向查询时语义模糊 - 你写的
profiles = user.follow_user.all(),实际上获取的是所有关注当前用户的人,而不是当前用户关注的人
优化Follow模型
先把Follow模型的字段和related_name改得更直观:
class Follow(models.Model): # 发起关注的用户(粉丝) follower = models.ForeignKey(User, related_name='following', on_delete=models.CASCADE) # 被关注的用户 followed = models.ForeignKey(User, related_name='followers', on_delete=models.CASCADE) date = models.DateTimeField(auto_now_add=True) old_instance = models.ForeignKey('Follow', blank=True, null=True, on_delete=models.CASCADE, editable=False) def save(self, *args, **kwargs): if self.pk is not None: self.old_instance = Follow.objects.get(pk=self.pk) super().save(*args,**kwargs) def __str__(self): return f"{self.follower.username} follows {self.followed.username}"
修正视图中获取关注用户ID的逻辑
现在可以用更清晰的方式获取当前用户关注的所有用户ID:
@api_view(['GET']) @permission_classes([IsAuthenticated]) def post_feed_view(request, *args, **kwargs): user = request.user # 获取当前用户所有的关注记录,每个记录的followed就是被关注的用户 follow_records = user.following.all() followed_users_id = [record.followed.id for record in follow_records] # 加上当前用户自己的ID,显示自己的帖子 followed_users_id.append(user.id) # 注意这里用author__id__in匹配Post模型的字段 queryset = Post.objects.filter(author__id__in=followed_users_id).order_by("-date_posted") serializer = PostSerializer(queryset, many=True) return Response(serializer.data, status=200)
3. 关于request.user的概念
request.user是Django为你自动填充的当前已认证的用户对象,因为你加了@permission_classes([IsAuthenticated])装饰器,所以只有登录用户才能访问这个视图,此时request.user肯定是一个有效的Django User模型实例。
它和你的Profile模型是一对一关联的,所以你可以通过request.user.profile直接访问当前用户的Profile信息(比如request.user.profile.bio获取用户简介)。
补充:同步更新Profile模型的followers/following属性
因为你修改了Follow模型的字段名,Profile里的两个统计属性也要同步修改,否则粉丝数和关注数会统计错误:
class Profile(models.Model): # ... 其他字段保持不变 ... @property def followers(self): # 统计所有关注当前用户的人数 return Follow.objects.filter(followed=self.user).count() @property def following(self): # 统计当前用户关注的人数 return Follow.objects.filter(follower=self.user).count() # ... 其他方法保持不变 ...
这样修改后,你的接口应该就能正常运行,同时逻辑也更清晰易维护了。
内容的提问来源于stack exchange,提问作者Nelson Kehinde
相关产品推荐
相关产品推荐

