modelviewset library framework filters python django django-rest-framework django-filter

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.

  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