django - 为什么在我的 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()
呢?
解决方案
这里的区别在于,这个:
User.objects.filter(id__in=follows)
使用 Django模型管理器从数据库中获取可用用户列表,然后将其过滤到用户的子集。
而这:
self.request.user.following.all()
正在从请求中获取它的信息。因此,除非您将完整的数据集与您的请求一起传递,否则您永远不会得到您所期望的。
推荐阅读
- bash - Bash变量不保存给定的新数据?
- php - PHP foreach 在更深的数组中
- bash - Flock 命令在锁定文件时删除所有数据
- android - Stripe android,我如何使用源卡创建 3ds 支付
- python - 使用对数比例错误的 seaborn 热图:无法找到沿轴的像素距离
- php - 如何在 Mac 上将 php7.1 升级到 7.3
- javascript - Jacascript base64 未根据需要解码
- php - 在 Phalcon 请求中获取 XDEBUG_SESSION_START 标头
- c# - 画一个有 3 条边的三角形
- vuetify.js - v-data-table - 在顶部添加滚动条