Django-filter: Könnte jemand ein Beispiel für die Verwendung mit der nativen Volltextsuchmaschine von Django/Postgres geben?

Erstellt am 16. Feb. 2019  ·  4Kommentare  ·  Quelle: carltongibson/django-filter

Documentation

Hilfreichster Kommentar

Hallo @gotexis. django-filter macht im Wesentlichen zwei Dinge:

  • Eingaben validieren
  • Konstruieren Sie Abfragen aus diesen Eingaben

Wenn es keine Filter Klasse gibt, die die gesuchte Abfrage erstellt, haben Sie zwei Möglichkeiten:

  • Schreiben Sie eine neue Filterklasse
  • Verwenden Sie die Filter.method Funktion.

Wenn Sie die Abfrage verallgemeinern können, wäre das Schreiben eines benutzerdefinierten Filter besser wiederverwendbar, Filter.method ist jedoch für einmalige Instanzen nützlich. Du würdest etwas schreiben wie:

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

Alle 4 Kommentare

Hallo @gotexis. django-filter macht im Wesentlichen zwei Dinge:

  • Eingaben validieren
  • Konstruieren Sie Abfragen aus diesen Eingaben

Wenn es keine Filter Klasse gibt, die die gesuchte Abfrage erstellt, haben Sie zwei Möglichkeiten:

  • Schreiben Sie eine neue Filterklasse
  • Verwenden Sie die Filter.method Funktion.

Wenn Sie die Abfrage verallgemeinern können, wäre das Schreiben eines benutzerdefinierten Filter besser wiederverwendbar, Filter.method ist jedoch für einmalige Instanzen nützlich. Du würdest etwas schreiben wie:

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, danke für deine Hilfe @rpkilby , bitte gib mir noch ein paar Tage Zeit, um diesen Code zu verdauen...

Im Moment schlage ich mir den Kopf mit Graphen-Django, das sich in Django-Filter integriert.

Ich hoffe, dies (idealerweise) mit GraphQL umsetzen zu können

Beachten Sie, dass es einige Probleme geben kann, wie graphene-django django-filter umhüllt. zB siehe #927

@rpkilby Ja, Sir
Es sieht aus wie es ist in der Tat jede Menge Probleme mit Graphene gegeben , wie unbeliebt Python + GraphQL als zu Knoten verglichen worden ist, und der Autor über das Projekt aufzugeben, würden Sie nicht zustimmen :)

Einer der neuesten, der auch mit django-filter zusammenhängt, ist, dass DjangoFilterConnectionField nicht mit Prefetching arbeitet, was zu Tonnen von Abfragen führt. Ich habe es versäumt, es zu debuggen, ich frage mich, ob Sie irgendwelche Erfahrungen haben, die Sie teilen können :)

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen