Включение тегов Django-Tagulous в поиск Q

#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' .