如何通过related_name从Follow查询集关联到User模型的外键对象
解决方法
你现在拿到的是Follow模型的查询集,要直接获取对应的userTarget(被关注的用户),可以用这几种方式:
方法1:遍历提取(简单但存在性能隐患)
直接遍历follower.all()的结果,取出每个对象的userTarget属性:
follow_objects = User.objects.get(pk=request.user.id).follower.all() followed_users = [obj.userTarget for obj in follow_objects if obj.userTarget]
注意要加上if obj.userTarget判断,因为你的userTarget字段允许为null,避免取出空值。但这种方式会触发N+1数据库查询(每个Follow对象单独查询一次User),数据量大时不推荐使用。
方法2:用select_related优化查询
提前关联userTarget对应的User表,减少数据库查询次数:
follow_objects = User.objects.get(pk=request.user.id).follower.select_related('userTarget').all() followed_users = [obj.userTarget for obj in follow_objects if obj.userTarget]
这样只会执行2次查询:一次获取当前用户的所有Follow记录,一次关联查询所有对应的User对象,性能比方法1提升明显。
方法3:直接获取User查询集(最优方案)
如果想直接得到User模型的查询集(支持后续链式操作,比如分页、排序),可以通过反向过滤User表,筛选出被当前用户关注的用户:
followed_users = User.objects.filter(followed__userPointer=request.user.id).distinct()
这里用到了related_name="followed"(对应Follow模型里的userTarget字段),通过反向关联过滤出所有Follow记录中userPointer为当前用户的userTarget,用distinct()避免重复结果(如果存在重复关注的情况)。这种方式直接返回User查询集,性能最优。
另外提个小建议:你的Follow模型里手动定义id = models.IntegerField(primary_key=True)其实没必要,Django默认会生成自增主键,除非有特殊业务需求,否则可以去掉这个字段,让Django自动处理。
内容的提问来源于stack exchange,提问作者parmer_110
相关产品推荐
相关产品推荐

