首页 > 解决方案 > 在 Q 搜索中包含 Django-Tagulous 标签

问题描述

我有一个博客风格的 Django 应用程序,并实现了 Django-Tagulous 来管理标签。

我有一个带有标题和内容等标准字段的 Post 模型,我还有一个标签字段

tags = tagulous.models.TagField()

当我创建一个帖子时,标签正在工作并正确保存,我现在开始研究搜索功能并在我的 post_list 视图中有以下内容

queryset_list = Post.objects.all().order_by('-timestamp')
query = request.GET.get("q")
if query:
    queryset_list = queryset_list.filter(
        Q(title__icontains=query)|
        Q(content__icontains=query)
    ).distinct()

我真的很想包含相关的标签,但不知道该怎么做。有没有人有任何指示如何在搜索中包含标签?我非常感谢您的帮助

标签: djangotagging

解决方案


是的,这README在 GitHub 上有所介绍。在幕后,TagField是 aManyToManyField指向一个模型TagModel[GitHub],因此我们可以查询多对多关系,例如:

queryset_list = queryset_list.filter(
    Q(title__icontains=query) |
    Q(content__icontains=query) |
    Q(tags__name=query)
).distinct()

因此,我们在这里过滤出一个带有 a 的标签,name这正是查询。但是我们可以添加__iexact[Django-doc]__contains[Django-doc]__icontains[Django-doc]查找,以使搜索更加复杂。例如:

queryset_list = queryset_list.filter(
    Q(title__icontains=query) |
    Q(content__icontains=query) |
    Q(tags__name__icontains=query)
).distinct()

将匹配所有有标签的对象,其中名称包含一个子字符串,忽略大小写,等于我们查询的内容。因此,如果您用 标记了某些'foobar'内容,那么它也将与查询匹配'Oo'


推荐阅读