基于另一模型字段筛选模型:Django查询关注用户帖子报错求助
解决Django查询关注用户帖子的字段不存在问题
嘿,我来帮你搞定这个查询报错的问题!你遇到的NameError: field not found是因为查询语句的关联逻辑不对——Post模型和Follow模型之间没有直接的外键关联,不能直接在Post的filter里用follow__xxx来跨表查询,得通过两者共同关联的User模型来搭桥。
错误原因分析
你的原查询语句:
postresult = Post.objects.all().filter(post_user=follow__follow_target, follow__follow_user=request.user)
这里直接用follow__follow_target是错误的,因为Post模型里根本没有名为follow的字段,Django不知道该怎么关联到Follow表,所以才会报错找不到字段。
正确的查询写法
这里提供两种简洁有效的写法:
方法一:通过双下划线跨表关联查询
利用Django的双下划线关联特性,通过Post的post_user外键,关联到User的follow_target(对应Follow模型里的related_name),再筛选关注者是当前用户的记录:
postresult = Post.objects.filter(post_user__follow_target__follow_user=request.user)
解释一下这个链式关联:
post_user:Post关联的发布用户post_user__follow_target:该用户被哪些人关注的Follow记录(对应Follow模型中follow_target的related_name)post_user__follow_target__follow_user=request.user:筛选出这些关注记录中,关注者是当前登录用户的,最终得到的就是当前用户关注的所有人发布的帖子。
方法二:先获取关注用户ID再筛选帖子
如果觉得双下划线关联有点绕,也可以分两步查询:先找出当前用户关注的所有用户ID,再筛选这些用户发布的帖子:
# 第一步:获取当前用户关注的所有用户ID列表 followed_user_ids = Follow.objects.filter(follow_user=request.user).values_list('follow_target_id', flat=True) # 第二步:筛选这些用户发布的帖子 postresult = Post.objects.filter(post_user_id__in=followed_user_ids)
这种写法逻辑更直观,适合刚接触Django查询的开发者。
额外小提示
你定义的Follow模型中,follow_target字段的related_name='follow_target'可以考虑改个更语义化的名字,比如followers,这样查询的时候post_user__followers__follow_user会更易读,不过当前的写法是完全可以正常工作的。
内容的提问来源于stack exchange,提问作者Super
相关产品推荐
相关产品推荐

