Django-filter: Filtern von ArrayField

Erstellt am 24. Aug. 2016  ·  4Kommentare  ·  Quelle: carltongibson/django-filter

Ist es möglich, in django.contrib.postgres.fields definierte Felder wie ArrayField zu filtern?

Hilfreichster Kommentar

django-filter hat derzeit keine Filter, die mit den Postgres-Contrib-Feldern kompatibel sind - Sie müssen Ihre eigenen erstellen. Es wird mehr oder weniger schwierig sein, je nachdem, was Sie versuchen. Die Unterstützung der benutzerdefinierten Lookups für ArrayField wäre ziemlich trivial:

class CharArrayFilter(filters.BaseCSVFilter, filters.CharFilter):
     pass

class MyFilterSet(filters.FilterSet):
    tags__contains = CharArrayFilter(name='tags', lookup_expr='contains')

    class Meta:
        model = SomethingTaggable
GET http://localhost/api/something-taggable?tags__contains=a,b,c

Der obige Filter validiert die durch Kommas getrennten Eingaben und gibt eine Liste bereinigter Werte zurück, die für den zugrunde liegenden .filter() Aufruf geeignet ist.

Auf der anderen Seite ist es etwas komplizierter, die Index- und Slice-Transformationen zu handhaben, die unstrukturiert sind und eine theoretisch unendliche Anzahl von Kombinationen haben.

Alle 4 Kommentare

django-filter hat derzeit keine Filter, die mit den Postgres-Contrib-Feldern kompatibel sind - Sie müssen Ihre eigenen erstellen. Es wird mehr oder weniger schwierig sein, je nachdem, was Sie versuchen. Die Unterstützung der benutzerdefinierten Lookups für ArrayField wäre ziemlich trivial:

class CharArrayFilter(filters.BaseCSVFilter, filters.CharFilter):
     pass

class MyFilterSet(filters.FilterSet):
    tags__contains = CharArrayFilter(name='tags', lookup_expr='contains')

    class Meta:
        model = SomethingTaggable
GET http://localhost/api/something-taggable?tags__contains=a,b,c

Der obige Filter validiert die durch Kommas getrennten Eingaben und gibt eine Liste bereinigter Werte zurück, die für den zugrunde liegenden .filter() Aufruf geeignet ist.

Auf der anderen Seite ist es etwas komplizierter, die Index- und Slice-Transformationen zu handhaben, die unstrukturiert sind und eine theoretisch unendliche Anzahl von Kombinationen haben.

Danke für die Information.

Ich werde dies vorerst als Out of Scope schließen. Gerne Berücksichtigung dokumentierter, getesteter Pull-Requests. Vielleicht haben wir in Zukunft die Möglichkeit, das zu überdenken.

Aktualisieren:
Der Parameter name wurde in field_name sodass MyFilterSet wie folgt aussehen sollte:

class MyFilterSet(filters.FilterSet):
    tags__contains = CharArrayFilter(field_name='tags', lookup_expr='contains')

    class Meta:
        model = SomethingTaggable
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen