Django rest marco de filtro

Estoy trabajando con una API hecha de Django rest framework, estoy tratando de hacer un filtro a un JSON Este es mi archivo serializers.py

 from rest_framework import serializers from .models import Establecimiento,Categoria,Ciudad,Zona import django_filters class EstablecimientoSerializer(serializers.ModelSerializer): class Meta: model = Establecimiento depth = 1 fields = ('nombre', 'ciudad', 'categoria', 'direccion', 'telefono', 'precioMinimo', 'precioMaximo',) 

y este mi archivo views.py

 from rest_framework import viewsets from .serializers import EstablecimientoSerializer, CategoriaSerializer from models import * from rest_framework import filters from rest_framework import generics class EstablecimientoViewSet(viewsets.ModelViewSet): queryset = Establecimiento.objects.all() serializer_class = EstablecimientoSerializer filter_fields = ('categoria',) 

Luego, en la clase EstablecimientoViewSet , puse un filter_fields = ('categoria',) para filtrar la API de la URL con el campo de categoría

Si agrego el filtro a los parámetros de consulta, el conjunto de resultados no cambia, muestra todos los datos sin filtrar.

 ...establecimiento?establecimiento=bar 

¿Cómo puedo hacer este filtro sobre este modelo?

Debe definir el backend del filtro y todos los campos relacionados en los que planea filtrar:

 class EstablecimientoViewSet(viewsets.ModelViewSet): filter_backends = (filters.DjangoFilterBackend,) filter_fields = ('categoria', 'categoria__titulo',) 

ejemplo:

 URL?categoria__titulo=Categoria 1 

También es posible proporcionar su propia clase de filtro , lo que puede darle más opciones y flexibilidad

 import sys, django_filters, json, io class TaskFilter(django_filters.FilterSet): tag = django_filters.CharFilter(name='tags__name', lookup_type='iexact') university = django_filters.NumberFilter(name='poster__university', lookup_type='exact') class Meta: model = Task fields = { 'poster': ['exact'], 'tasker': ['exact'], 'status': ['exact'], 'created': ['lt', 'gt'] } 

En este ejemplo tengo filtros.

  1. poster = 1
  2. tasker = 115
  3. estado = O
  4. created__lt = 2015-09-22 17: 39: 01.184681 (para que pueda filtrar fecha y hora por valores MENOS ENTONCES)

  5. created__gt = 2015-09-22 17: 39: 01.184681 (o MAYOR QUE el valor proporcionado)

También puedo ocultar campos extranjeros con campos de filtro personalizados, en este caso es etiqueta y universidad . Además puedo proporcionar operador de comparación ( lookup_type )

Solicitud de muestra:

 GET /api/v1/tasks/?offset=0&status=O&limit=100&university=1&ordering=-created&created__lt=2015-09-22 17:39:01.184681&tag=sport HTTP/1.1 Host: domain.com Content-Type: application/json Authorization: token 61cbd3c7c2656d4e24edb31f5923a86910c67b7c User-Timezone: US/Pacific Cache-Control: no-cache 

Para mí, funciona cuando pongo la coma al final de mis campos de filtro.

p.ej.

 filter_fields = ('distribuidor',)