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字段。

解决方案:

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

    class Meta:
        fields = ('content', 'created', 'suspended', 'user', 'is_following')  # 添加'is_following'字段
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        fields = ('date_joined', 'email', 'first_name', 'id', 'is_active', 'is_following', 'last_name', 'username')  # 添加'is_following'字段
class PostViewSet(ModelViewSet):
    # ...
    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
def get_username(request):
    serializer = UserSerializer(request.user)
    return serializer.data['username']
class PostSerializer(serializers.ModelSerializer):
    user = serializers.SerializerMethodField()

    def get_user(self, obj):
        serializer = UserSerializer(obj.user)
        return serializer.data
class PostViewSet(ModelViewSet):
    # ...
    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