Django REST Framework中无法从嵌套序列化器读取数据
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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。