Django实现用户关注系统查询时报Unsupported lookup 'following'错误
报错原因
报错Unsupported lookup 'following' for CharField or join on the field not permitted的核心触发点是跨表查询的关联路径错位:
- 你编写的查询条件
author__username__following__in=[logged_in_user.id],顺着关联链路拆解:- 从
Video模型通过author外键关联到Account模型,这一步是合法的跨表路径 - 继续从Account模型关联到
username字段——但username是存储字符串的CharField,本身不具备跨表关联属性,更没有名为following的关联关系,Django无法在普通标量字段上执行跨表join,直接抛出对应错误。
- 从
- 本质是对多对多字段的归属逻辑理解偏差:
following是定义在Account模型上的字段,代表当前用户主动关注的其他账号集合,它不是依附在用户名这类普通字段上的属性。
修正后的查询实现
需求是“展示当前登录用户所关注账号发布的全部视频内容”,无需绕弯关联用户名这类普通字段,直接通过关联外键过滤即可,有两种等价的可运行写法:
写法1(可读性更强)
class home_screen_view(LoginRequiredMixin, View): def get(self, request, *args, **kwargs): logged_in_user = request.user # 直接取当前用户关注的所有账号集合 followed_authors = logged_in_user.following.all() # 过滤这些关注账号发布的视频,按发布时间倒序 post = Video.objects.filter( author__in=followed_authors ).order_by('-created_date') context = { 'post_list': post, } return render(request, "personal/home.html", context)
写法2(查询效率更高)
# 直接通过外键关联当前用户的关注集合,无中间变量 post = Video.objects.filter( author__in=logged_in_user.following.all() ).order_by('-created_date')
容易遗漏的代码问题
你当前的Video模型定义里缺少排序逻辑依赖的created_date字段,后续运行排序代码会触发字段不存在的报错,需要在Video模型中补全对应定义:
class Video(models.Model): author = models.ForeignKey(Account, on_delete=models.CASCADE) video = models.FileField(upload_to='post-videos') title = models.CharField(max_length=100) description = models.TextField(null=True, blank=True) # 补全发布时间字段支撑排序逻辑 created_date = models.DateTimeField(auto_now_add=True)
关联逻辑避坑说明
- 跨表查询时,只有外键、多对多、一对一这类关联字段可以作为join节点,普通CharField、IntegerField这类标量字段后面不能继续接跨表查找,否则必然触发同类报错。
- 注意多对多字段的双向关系:
当前用户.following.all()拿到的是当前用户关注的所有账号- 你在多对多字段上定义的
related_name='follow'是反向关联的入口:如果要查“哪些账号关注了某个指定用户”,可以通过指定用户.follow.all()拿到对应集合,不要把两个方向的查询条件搞混。
内容的提问来源于stack exchange,提问作者Soliman
相关产品推荐
相关产品推荐

