Django-filter: Filtrando ArrayField

Criado em 24 ago. 2016  ·  4Comentários  ·  Fonte: carltongibson/django-filter

É possível filtrar campos definidos em django.contrib.postgres.fields como ArrayField ?

Comentários muito úteis

django-filter atualmente não tem nenhum filtro compatível com os campos contrib do postgres - você precisa criar o seu próprio. Será mais ou menos difícil dependendo do que você está tentando fazer. Apoiar as pesquisas personalizadas para ArrayField seria bastante 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

O filtro acima validará as entradas separadas por vírgula e retornará uma lista de valores limpos, que é adequada para a chamada .filter() subjacente.

Por outro lado, é um pouco mais complicado lidar com as transformações de índice e fatia, que não são estruturadas e têm uma quantidade teoricamente infinita de combinações.

Todos 4 comentários

django-filter atualmente não tem nenhum filtro compatível com os campos contrib do postgres - você precisa criar o seu próprio. Será mais ou menos difícil dependendo do que você está tentando fazer. Apoiar as pesquisas personalizadas para ArrayField seria bastante 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

O filtro acima validará as entradas separadas por vírgula e retornará uma lista de valores limpos, que é adequada para a chamada .filter() subjacente.

Por outro lado, é um pouco mais complicado lidar com as transformações de índice e fatia, que não são estruturadas e têm uma quantidade teoricamente infinita de combinações.

Obrigado pela informação.

Vou encerrar como Fora do escopo por enquanto. Fico feliz em considerar solicitações de pull testadas e documentadas. Podemos ter capacidade de reconsiderar no futuro.

Atualizar:
O parâmetro name foi renomeado para field_name então MyFilterSet deve ser parecido com:

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

    class Meta:
        model = SomethingTaggable
Esta página foi útil?
0 / 5 - 0 avaliações