Подтвердить что ты не робот

Фильтр рамки django rest

Я работаю с API, созданным из рамки Django rest, Я пытаюсь сделать фильтр для JSON Это мой 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',)

и этот файл 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',)

Затем в классе EstablecimientoViewSet я помещаю a filter_fields = ('categoria',) для фильтрации API url с полем категории

Если я добавлю фильтр к параметрам запроса, набор результатов не изменится, он отобразит все данные без фильтрации.

...establecimiento?establecimiento=bar

Как я могу сделать этот фильтр об этой модели?

4b9b3361

Ответ 1

Вам необходимо определить сервер фильтра и все связанные поля, которые вы планируете фильтровать:

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

Пример:

URL?categoria__titulo=Categoria 1

Ответ 2

он также может предоставить ваш собственный класс Фильтр, что может дать вам больше возможностей и гибкости

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']
        }

В этом примере я получил фильтры

  • poster = 1
  • tasker = 115
  • status = O
  • created__lt = 2015-09-22 17: 39: 01.184681 (поэтому я могу фильтровать datetime значениями LESS THEN)

  • created__gt = 2015-09-22 17: 39: 01.184681 (или БОЛЬШЕ, ЧЕМ значение)

Также я могу скрыть внешние поля с полями пользовательского фильтра, в этом случае это тег и университет. Плюс я могу предоставить оператор сравнения (lookup_type)

Пример запроса:

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

Ответ 3

Для меня это работает, когда я помещаю запятую в конец моих фильтрующих полей.

например.

filter_fields = ('distribuidor',)

Ответ 4

в моем случае, я пропустил запятую между полями фильтра

filter_fields = ( 'user', 'object_id' 'content_type' )

уведомление отсутствует "," между "object_id" и "content_type". получил ту же ошибку