Django-filter: Filtrage ArrayField

Créé le 24 août 2016  ·  4Commentaires  ·  Source: carltongibson/django-filter

Est-il possible de filtrer les champs définis dans django.contrib.postgres.fields comme ArrayField ?

Commentaire le plus utile

django-filter n'a actuellement aucun filtre compatible avec les champs de contribution postgres - vous devrez créer le vôtre. Ce sera plus ou moins difficile selon ce que vous essayez de faire. La prise en charge des recherches personnalisées pour ArrayField serait assez simple :

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

Le filtre ci-dessus validera les entrées séparées par des virgules et renverra une liste de valeurs nettoyées, qui convient à l'appel .filter() sous-jacent.

En revanche, c'est un peu plus compliqué de gérer les transformations d'index et de slice, qui ne sont pas structurées et ont une quantité théoriquement infinie de combinaisons.

Tous les 4 commentaires

django-filter n'a actuellement aucun filtre compatible avec les champs de contribution postgres - vous devrez créer le vôtre. Ce sera plus ou moins difficile selon ce que vous essayez de faire. La prise en charge des recherches personnalisées pour ArrayField serait assez simple :

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

Le filtre ci-dessus validera les entrées séparées par des virgules et renverra une liste de valeurs nettoyées, qui convient à l'appel .filter() sous-jacent.

En revanche, c'est un peu plus compliqué de gérer les transformations d'index et de slice, qui ne sont pas structurées et ont une quantité théoriquement infinie de combinaisons.

Merci pour l'information.

Je vais clore ceci comme hors champ pour le moment. Heureux d'examiner les demandes d'extraction documentées et testées. Nous pourrions avoir la capacité de reconsidérer à l'avenir.

Mettre à jour:
Le paramètre name a été renommé en field_name donc le MyFilterSet devrait ressembler à :

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

    class Meta:
        model = SomethingTaggable
Cette page vous a été utile?
0 / 5 - 0 notes