Django-filter: Может ли кто-нибудь привести пример для использования с собственной системой полнотекстового поиска Django / Postgres?

Созданный на 16 февр. 2019  ·  4Комментарии  ·  Источник: carltongibson/django-filter

Совершенно нуб здесь ....

https://docs.djangoproject.com/en/2.1/ref/contrib/postgres/search/#postgresql -fts-search-configuration

Documentation

Самый полезный комментарий

Привет @gotexis. django-filter в основном делает две вещи:

  • Подтвердить ввод
  • Создавать запросы из этих входных данных

Когда нет класса Filter который создает

  • Напишите новый класс фильтра
  • Используйте функцию Filter.method .

Если вы можете обобщить запрос, написание пользовательского Filter было бы более удобным для повторного использования, однако Filter.method полезно для разовых экземпляров. Вы бы написали что-то вроде:

from django.contrib.postgres.search import SearchQuery, SearchVector
from djanog_filters import FilterSet, CharFilter

class F(FilterSet):
    # The model `field_name` is the field you want to search on and is passed to your `method`.
    # The `method` argument is the name of the method to call to perform filtering.
    search = CharFilter(field_name='body_text', method='search_fulltext')

    def search_fulltext(self, queryset, field_name, value):
        return queryset \
            .annotate(search=SearchVector(field_name)) \
            .filter(search=SearchQuery(value))

Все 4 Комментарий

Привет @gotexis. django-filter в основном делает две вещи:

  • Подтвердить ввод
  • Создавать запросы из этих входных данных

Когда нет класса Filter который создает

  • Напишите новый класс фильтра
  • Используйте функцию Filter.method .

Если вы можете обобщить запрос, написание пользовательского Filter было бы более удобным для повторного использования, однако Filter.method полезно для разовых экземпляров. Вы бы написали что-то вроде:

from django.contrib.postgres.search import SearchQuery, SearchVector
from djanog_filters import FilterSet, CharFilter

class F(FilterSet):
    # The model `field_name` is the field you want to search on and is passed to your `method`.
    # The `method` argument is the name of the method to call to perform filtering.
    search = CharFilter(field_name='body_text', method='search_fulltext')

    def search_fulltext(self, queryset, field_name, value):
        return queryset \
            .annotate(search=SearchVector(field_name)) \
            .filter(search=SearchQuery(value))

Вау, спасибо за помощь @rpkilby , пожалуйста, дайте мне еще несколько дней, чтобы переварить этот код ...

Прямо сейчас я бью головой о graphene-django, который интегрируется с django-фильтрами.

Я надеюсь (в идеале) реализовать это с помощью GraphQL

Обратите внимание, что могут быть некоторые проблемы с тем, как graphene-django обертывает django-filter. например, см. # 927

@rpkilby Да, сэр
Похоже, что с Graphene действительно есть куча проблем, учитывая, насколько непопулярным стал Python + GraphQL по сравнению с Node, плюс автор отказывается от проекта, согласны ли вы :)

Одним из самых последних, также связанных с django-filter, является их DjangoFilterConnectionField, который не работает с предварительной выборкой, что приводит к множеству запросов. Мне не удалось его отладить, интересно, есть ли у вас какой-нибудь опыт, которым можно поделиться :)

Была ли эта страница полезной?
0 / 5 - 0 рейтинги