#django #tagging
#django #пометка
Вопрос:
У меня есть приложение Django в стиле блога, и я внедрил Django-Tagulous для управления тегами.
У меня есть модель публикации со стандартными полями, такими как заголовок и содержимое, и у меня также есть поле тегов
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()
Я бы действительно хотел включить связанные теги, но не могу разобраться, как это сделать.
Есть ли у кого-нибудь какие-либо указания, как включать теги в поисковые запросы?
Я был бы действительно признателен за помощь
Ответ №1:
Да, это описано в README
на GitHub. За кулисами TagField
— это ManyToManyField
, которое указывает на модель TagModel
[GitHub], и мы можем, таким образом, запросить отношение «многие ко многим», например:
queryset_list = queryset_list.filter(
Q(title__icontains=query) |
Q(content__icontains=query) |
Q(tags__name=query)
).distinct()
Таким образом, здесь мы фильтруем наличие тега с 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'
.