首页 > 解决方案 > 为什么在我的 Django 应用程序中无法获取当前用户的关注用户?

问题描述

我正在使用auth.User用户对象的标准模型,我的Follow对象模型定义如下:

class Follow(models.Model):

    owner = models.ForeignKey(
        'auth.User',
        related_name='followers',
        on_delete=models.CASCADE,
        null=False
    )
    following = models.ForeignKey(
        'auth.User',
        related_name='following',
        on_delete=models.CASCADE,
        null=False
    )

我使用的序列化器如下:

class PublicUserSerializer(serializers.ModelSerializer):

    class Meta:

        model = User
        fields = ('id', 'username')
        read_only_fields = ('id', 'username')

我的观点如下:

class FollowingView(generics.ListAPIView):

    serializer_class = PublicUserSerializer
    permission_classes = (permissions.IsAuthenticated,)

    def get_queryset(self):
        return self.request.user.following.all()

由于某种我无法理解的原因,这将返回一个空的结果集。但是,如果我对视图使用以下代码,它会返回正确的查询集:

class FollowingView(generics.ListAPIView):

    serializer_class = PublicUserSerializer
    permission_classes = (permissions.IsAuthenticated,)

    def get_queryset(self):
        follows = Follow.objects.filter(owner=self.request.user).values_list('following_id', flat=True)
        return User.objects.filter(id__in=follows)

那么为什么我不能通过使用获得正确的查询集self.request.user.following.all()呢?

标签: djangodjango-rest-framework

解决方案


这里的区别在于,这个:

User.objects.filter(id__in=follows)

使用 Django模型管理器从数据库中获取可用用户列表,然后将其过滤到用户的子集。

而这:

self.request.user.following.all()

正在从请求中获取它的信息。因此,除非您将完整的数据集与您的请求一起传递,否则您永远不会得到您所期望的。


推荐阅读