class OrderFilter(django_filters.FilterSet):
class Meta:
model = Order
fields = {
'status': ['exact',],
'client': ['icontains',],
}
class OrderViewset(viewsets.ModelViewSet):
filter_class = OrderFilter
permission_classes = ( permissions.IsAuthenticated, )
serializer_class = OrderSerializer
queryset = Order.objects.all()
filter_backends = (
filters.OrderingFilter,
filters.SearchFilter,
filters.DjangoFilterBackend
)
ordering_fields = ('added_at', 'status', 'client', 'order_number')
ordering = ('-added_at',)
class Order(models.Model):
order_number = models.CharField(max_length=255, default='')
client = models.CharField(max_length=255, default='')
status = models.CharField(max_length=255, default='')
added_at = models.DateTimeField(auto_now_add=True)
O filtro do cliente é basicamente ignorado. Se eu substituir icontains por exact, funciona.
Mas não consigo fazer conteúdo ou conteúdo para trabalhar em nenhum campo.
Requisitos.txt:
Django == 1.10.4
psycopg2 == 2.6.2
djangorestframework == 3.5.3
canais == 1.0.0
djangorestframework-jwt == 1.9.0
django-filter == 1.0.1
asgi-redis == 1.0.0
daphne == 1.0.0
Olá, @xtrinch.
Pela descrição, não consigo ver o problema. Posso aconselhar que você tente colocar um ponto de interrupção em sua propriedade FilterSet
qs
e ver o que está acontecendo.
Se você pudesse restringi-lo a um caso de teste simples, isso também ajudaria.
Filter
apenas pega o valor e constrói uma pesquisa para o ORM, então a pergunta é: _O que isso está dando errado? _
Olá @xtrinch - você poderia postar um URL de amostra com parâmetros de consulta? Meu palpite é que você está consultando /api/orders?status=foo
vez de /api/orders?status__icontains=foo
. Há uma observação nos documentos Meta.fields
que explica o comportamento ligeiramente diferente das pesquisas exact
.
@rpkilby Obrigado. Tive a impressão de que o primeiro item da matriz se tornaria o filtro padrão - vejo que estava errado :)
sua postagem é muito útil para mim no meu projeto
Obrigado
Comentários muito úteis
Olá @xtrinch - você poderia postar um URL de amostra com parâmetros de consulta? Meu palpite é que você está consultando
/api/orders?status=foo
vez de/api/orders?status__icontains=foo
. Há uma observação nos documentosMeta.fields
que explica o comportamento ligeiramente diferente das pesquisasexact
.