Django REST Framework中无法从嵌套序列化器读取数据

后端开发 2026-07-12

models.py

class Post(models.Model):
  content = models.TextField()
  created = models.DateTimeField(auto_now_add=True)
  suspended = models.BooleanField(default=False)
  user = models.ForeignKey(User, on_delete=models.CASCADE)

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

  class Meta:
    unique_together = ('follower', 'following')

serializer.py

class PostSerializer(serializers.ModelSerializer):
    user = UserSerializer(read_only=True)

class UserSerializer(serializers.ModelSerializer):
    is_following = serializers.BooleanField(read_only=True)

views.py

class PostViewSet(ModelViewSet):
    serializer_class = PostSerializer
    permission_classes = [IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly]

    def get_queryset(self):
        queryset = Post.objects.filter(
            suspended=False
        ).select_related(
            'user'
        )
        if self.request.user.is_authenticated:
            queryset = queryset.annotate(
                user__is_following=Exists(
                    Follow.objects.filter(
                        follower=self.request.user,
                        following=OuterRef("user_id")
                    )
                )
            )
        else:
            queryset = queryset.annotate(
                user__is_following=Value(False)
            )
        return queryset

我没法在用户对象中检查 is_following

在我的帖子列表中,我使用嵌套序列化器来获取每条帖子的用户信息,但在尝试检查 is_following 时失败了。我想了解我哪里出错了,因为我是DRF新手。

编辑

    {
    "next": "http://localhost:8000/v1/posts/?cursor=cD0yMDI2LTAzLTA2KzIxJTNBMDclM0E0Ny43NTc4MDklMkIwMCUzQTAw",
    "previous": null,
    "results": [
        {
            "content": "deneme 22",
            "created": "2026-03-06T21:08:12.630305Z",
            "id": 22,
            "suspended": false,
            "user": {
                "date_joined": "2026-03-06T21:05:15.279892Z",
                "email": "[email protected]",
                "first_name": "",
                "id": 1,
                "is_active": true,
           >>>> "is_following", >>>> This field is not showing!!
                "last_name": "",
                "username": "erkan.unluturk"
            }
        }
    ]
}

解决方案

你可以试试使用 SubQuery 吗?文档中提到,你可能需要在OuterRef的情况下使用子查询。

当一个 Subquery 中的查询集需要引用外层查询或其转换中的字段时,请使用 OuterRef。它的作用类似于一个 F 表达式,区别在于对是否引用有效字段的检查不会在外层查询集解析前进行。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章