python - library - django resto marco de filtro
django rest framework post (3)
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
Para mí, funciona cuando pongo la coma al final de mis campos de filtro.
p.ej.
filter_fields = (''distribuidor'',)
También es posible proporcionar su propia clase de filtro , lo que le puede dar 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.
- poster = 1
- tasker = 115
- estado = O
created__lt = 2015-09-22 17: 39: 01.184681 (para que pueda filtrar fecha y hora por valores MENOS ENTONCES)
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