django休息框架过滤器

use*_*034 23 python django django-filter django-rest-framework

我正在使用由Django rest框架制作的API,我正在尝试对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',)
Run Code Online (Sandbox Code Playgroud)

这是我的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',)
Run Code Online (Sandbox Code Playgroud)

然后在EstablecimientoViewSet课堂上,我用一个filter_fields = ('categoria',) 用类别字段过滤url的API

如果我将过滤器添加到查询参数中,结果集不会更改,它会显示未过滤的所有数据.

...establecimiento?establecimiento=bar
Run Code Online (Sandbox Code Playgroud)

如何对此模型进行过滤?

mar*_*dev 32

您需要定义过滤器后端以及您计划过滤的所有相关字段:

class EstablecimientoViewSet(viewsets.ModelViewSet):
    filter_backends = (filters.DjangoFilterBackend,)
    filter_fields = ('categoria', 'categoria__titulo',)
Run Code Online (Sandbox Code Playgroud)

例:

URL?categoria__titulo=Categoria 1
Run Code Online (Sandbox Code Playgroud)

  • @ psychok7,你必须在元组filter_fields的末尾添加一个逗号.这样做可以解决它. (18认同)
  • 这不适合我.我正在使用Django 1.7.您确定Filter字段和后端也适用于ModelViewset吗?这与泛型的APIListview完美配合. (5认同)
  • 在我的情况下与DJango 1.7我得到一个`Meta.fields包含一个未在此FilterSet上定义的字段`也使用modelviewsets (4认同)

Dmi*_*nov 7

它也可以提供您自己的Filter类,这可以为您提供更多选项和灵活性

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']
        }
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我有过滤器

  1. 海报= 1
  2. tasker = 115
  3. status = O.
  4. created__lt = 2015-09-22 17:39:01.184681(所以我可以按值减去日期时间)

  5. 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
Run Code Online (Sandbox Code Playgroud)