在 Q 搜索中包含 Django-Tagulous 个标签

Including Django-Tagulous tags in a Q Search

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

我有一个 Post 模型,其中包含标题和内容等标准字段,我还有一个标签字段

tags = tagulous.models.TagField()

当我创建 Post 标签时,标签可以正常工作并正确保存,我现在开始处理搜索功能并在我的 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()

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

是的,这个在README on GitHub. Behind the curtains, the TagField is a ManyToManyField that points to a model TagModel [GitHub]里面有讲到,我们可以这样查询多对多的关系,比如:

queryset_list = queryset_list.filter(
    Q(title__icontains=query) |
    Q(content__icontains=query) |
    <b>Q(tags__name=query)</b>
).distinct()

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

queryset_list = queryset_list.filter(
    Q(title__icontains=query) |
    Q(content__icontains=query) |
    Q(tags__name<b>__icontains</b>=query)
).distinct()

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