Django使用django-taggit如何忽略大小写查询匹配标签对应的对象
实现方案
你可以通过以下两种通用方式实现忽略大小写的标签匹配,无需依赖数据库的排序规则配置:
方案1:用Q对象拼接大小写不敏感匹配条件(兼容性最好)
直接使用Django内置的__iexact查询谓词实现单标签的大小写不敏感匹配,批量拼接后即可支持多标签查询:
from django.db.models import Q def home(request): search_tags = ['harry-potter', 'Champak', 'Physics'] # 构造查询条件:匹配任意一个目标标签的大小写变体 query = Q() for tag in search_tags: query |= Q(tags__name__iexact=tag) # distinct用于去重,避免多对多查询返回重复书籍记录 books = Book.objects.filter(query).distinct() print(books) return HttpResponse("Books Retrieved")
方案2:统一将数据库标签转为小写后匹配(代码更简洁)
通过Django内置的Lower函数将数据库存储的标签名统一转为小写,再和你预处理为小写的查询标签列表匹配:
from django.db.models.functions import Lower def home(request): search_tags = ['harry-potter', 'Champak', 'Physics'] # 将查询标签统一转为小写 lower_search_tags = [tag.lower() for tag in search_tags] # 先把数据库中标签名转小写,再匹配目标列表,distinct去重 books = Book.objects.annotate( lower_tag_name=Lower('tags__name') ).filter( lower_tag_name__in=lower_search_tags ).distinct() print(books) return HttpResponse("Books Retrieved")
内容的提问来源于stack exchange,提问作者Vishal Pandey
相关产品推荐
相关产品推荐

