为什么我不能在Django应用程序中获得当前用户的关注用户?

时间:2018-06-18 03:07:52

标签: django django-rest-framework

我正在使用User对象的标准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()

来获取正确的查询集

1 个答案:

答案 0 :(得分:0)

这里的区别在于:

User.objects.filter(id__in=follows)

使用Django Model Manager以获取数据库中的可用用户列表,然后将其过滤到用户的子集。

鉴于此:

self.request.user.following.all()

从请求中获取信息。因此,除非您使用您的请求传递完整的数据集,否则您将无法获得您期望的结果。