Django集成taggit实现标签搜索报icontains无效查询错误如何解决
问题原因及解决方案
你遇到的报错是因为django-taggit的TaggableManager是多对多关系字段,指向内置的Tag模型,不能直接对关系字段使用字符串匹配规则,需要穿透到Tag模型的存储标签文本的name字段做查询。
修正后的代码
from taggit.models import Tag def search_page(request): # 兜底获取空字符串,避免None报错 query = request.GET.get('p', '').strip() object_list = BlogPost.objects.all() if query: # 指定关联Tag表的name字段做模糊匹配,加distinct去重,避免同一博文匹配多个标签返回重复结果 object_list = object_list.filter(tags__name__icontains=query).distinct() context = {'posts': object_list, 'query': query} return render(request, 'search.html', context)
之前方案报错的原因
- 使用
.filter(tags__in=query)报错:__in需要传入可迭代的Tag实例集合或者标签名列表,你传入的是单个字符串(未传查询参数时是None),不符合字段要求。 - 使用
Tag.objects.filter(question__tags__icontains=query)报错:一是你的模型中没有名为question的关联字段,找不到对应关系;二是同样没有指定name字段就对关系字段用字符串匹配规则。
如果需要精确匹配标签名,把icontains替换为exact或者iexact即可。
内容的提问来源于stack exchange,提问作者user16559633
相关产品推荐
相关产品推荐

