Включение тегов Django-Tagulous в Q Search - PullRequest
0 голосов
/ 02 марта 2019

У меня есть приложение Django в стиле блога, и я реализовал Django-Tagulous для управления тегами.

У меня есть модель Post со стандартными полями, такими как Title и Content, а также поле для тегов

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 Ответ

0 голосов
/ 02 марта 2019

Да, это описано в README на GitHub .За занавесом TagField - это ManyToManyField, который указывает на модель TagModel [GitHub] , и поэтому мы можем запросить отношение «многие ко многим»,например:

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

Здесь мы, таким образом, фильтруем, что существует тег с name, который является именно запросом.Но мы можем добавить __iexact [Джанго-док] , __contains [Джанго-док] или __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'.

...