Django-filter: Quelqu'un pourrait-il donner un exemple à utiliser avec le moteur de recherche en texte intégral natif Django/Postgres ?

Créé le 16 févr. 2019  ·  4Commentaires  ·  Source: carltongibson/django-filter

Totalement noob ici ....

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

Documentation

Commentaire le plus utile

Salut @gotexis. Django-filter fait essentiellement deux choses :

  • Valider les entrées
  • Construire des requêtes à partir de ces entrées

Lorsqu'il n'y a pas Filter classe

  • Écrire une nouvelle classe de filtre
  • Utilisez la fonction Filter.method .

Si vous pouvez généraliser la requête, écrire un Filter serait plus réutilisable, cependant Filter.method est utile pour les instances ponctuelles. Vous écririez quelque chose comme :

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))

Tous les 4 commentaires

Salut @gotexis. Django-filter fait essentiellement deux choses :

  • Valider les entrées
  • Construire des requêtes à partir de ces entrées

Lorsqu'il n'y a pas Filter classe

  • Écrire une nouvelle classe de filtre
  • Utilisez la fonction Filter.method .

Si vous pouvez généraliser la requête, écrire un Filter serait plus réutilisable, cependant Filter.method est utile pour les instances ponctuelles. Vous écririez quelque chose comme :

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))

Wow merci pour votre aide @rpkilby , donnez-moi s'il vous plaît quelques jours de plus pour digérer ce code...

En ce moment, je me cogne la tête avec du graphène-django qui s'intègre aux django-filtres.

J'espère (idéalement) implémenter cela avec GraphQL

Notez qu'il peut y avoir des problèmes avec la façon dont graphene-django enveloppe django-filter. par exemple, voir #927

@rpkilby Oui monsieur
Il semble qu'il y ait en effet des tas de problèmes avec Graphene étant donné à quel point Python + GraphQL est devenu impopulaire par rapport à Node, et l'auteur abandonne le projet, n'êtes-vous pas d'accord :)

L'un des plus récents, également lié à django-filter, est que DjangoFilterConnectionField ne fonctionne pas avec le préchargement, ce qui entraîne des tonnes de requêtes. Je n'ai pas réussi à le déboguer, je me demande si vous avez une expérience à partager :)

Cette page vous a été utile?
0 / 5 - 0 notes