在 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'
匹配。
我有一个博客风格的 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'
匹配。