Django-filter: O método django_filters.BooleanFilter com e um filtro booleano herdado de um modelo não funcionam da mesma maneira.

Criado em 24 abr. 2017  ·  3Comentários  ·  Fonte: carltongibson/django-filter

Eu encontrei um problema que o filtro booleano criado por django_filters.BooleanFilter espera parâmetros de consulta diferentes com o filtro booleano herdado do modelo.
O filtro booleano herdado do modelo espera que o parâmetro seja verdadeiro ou falso, um filtro criado por BooleanFilter espera que os parâmetros sejam:
1 - traduzido para "não definido"
2 - traduzido para "Verdadeiro"
3 - traduzido para "Falso"
Esse comportamento deixa claro como processar os filtros personalizados da API de descanso do lado do javascript.

Código de exemplo:

modelos.py:
class TestModel(models.Model): first = models.BooleanField() last = models.BooleanField()
api.py

`importar django_filters
de conjuntos de visualizações de importação de rest_framework, serializadores
de .models importar TestModel

class TestFilter(django_filters.rest_framework.FilterSet):
first_and_last = django_filters.BooleanFilter(method='first_and_last_filter')
def first_and_last_filter(self, queryset, name, value):
se valor==Verdadeiro:
return queryset.filter(first=True, last=True);
retornar conjunto de consultas;
classe Meta:
modelo = modelo de teste
campos = ['primeiro', 'último', 'primeiro_e_último']

class TestSerializer(serializers.ModelSerializer):
classe Meta:
modelo = modelo de teste
campos = ['primeiro', 'último']

class TestViewSet(viewsets.ModelViewSet):
modelo = modelo de teste
queryset = TestModel.objects.all()
serializer_class = TestSerializer
filter_backends = (django_filters.rest_framework.DjangoFilterBackend,)
filter_fields = ('first', 'last', 'first_and_last', )
filter_class = TestFilter`

O filtro do conjunto de visualizações de teste aqui espera que o parâmetro de consulta seja "true" ou "false" para os campos "first" e "last", mas espera que seja 1,2 ou 3 para o campo de filtro "first_and_last".
Por exemplo, filtrar a consulta a frio fica assim:
/api/test/?first=true&first_and_last=2

Este é um exemplo simplificado no projeto real que encontrei, o filtro personalizado contém uma lógica mais complicada.
Configurei o repositório com todo o código necessário para reproduzir o problema.
https://github.com/inakrin/boolfilter

Comentários muito úteis

Todos 3 comentários

Portanto, provavelmente deve ser mencionado na documentação do DRF porque eles sugerem importar de filtros:
http://www.django-rest-framework.org/api-guide/filtering/#specifying -a-filterset
E funciona, é claro, em todos os casos, exceto BooleanFilter.

Esta página foi útil?
0 / 5 - 0 avaliações