Django外键模糊搜索报错Related Field got invalid lookup: icontains
错误原因
报错Related Field got invalid lookup: icontains的核心原因是跨表查询的字段路径写错了:
你的Post模型中author外键直接关联Django内置User模型,User模型中存储用户名称的字段是username,不存在名为author的字段。你写的author__author__icontains相当于从Post关联到User表后,又尝试查找User表下不存在的author关联字段,查询没有落到具体的文本字段上,直接在外键关系字段上调用了文本查询方法,自然触发报错。
正确实现代码
把查询语句修正为指向User模型实际存在的文本字段即可,以匹配文章标题、作者用户名的模糊搜索为例,修改后的搜索视图核心查询逻辑如下:
def search(request): if request.method == "POST": searched = request.POST['searched'] # 外键查询必须落到具体的文本字段上:author是外键,指向User表的username字段 posts = Post.objects.filter( Q(title__icontains=searched) | Q(author__username__icontains=searched) ) return render(request, 'blog/search.html', {'searched': searched, 'posts': posts}) else: return render(request, 'blog/search.html', {})
补充说明
- Django跨外键做文本模糊查询的规则是:双下划线顺着关联关系一路写,最后必须落到
CharField、TextField这类存储文本的具体字段上,才能使用icontains、contains这类文本查询运算符,不能直接在外键字段本身调用这类查询。 - 如果需要让搜索同时匹配文章正文,直接在Q对象里追加
Q(content__icontains=searched),用|做或条件连接即可。 - 如果你用的是自定义用户模型,把
author__username里的username替换成你自定义用户模型中存储昵称、姓名的对应字段名即可。
内容的提问来源于stack exchange,提问作者CountDOOKU
相关产品推荐
相关产品推荐

