我正在使用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()
?
答案 0 :(得分:0)
这里的区别在于:
User.objects.filter(id__in=follows)
使用Django Model Manager以获取数据库中的可用用户列表,然后将其过滤到用户的子集。
鉴于此:
self.request.user.following.all()
从请求中获取信息。因此,除非您使用您的请求传递完整的数据集,否则您将无法获得您期望的结果。