我正在使用由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',)
和我的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
课程中,我添加了filter_fields = ('categoria',)
使用类别字段
如果我将过滤器添加到查询参数中,结果集不会更改,它会显示所有未过滤的数据。
...establecimiento?establecimiento=bar
如何针对此模型制作此过滤器?
答案 0 :(得分:32)
您需要定义过滤后端以及您计划过滤的所有相关字段:
class EstablecimientoViewSet(viewsets.ModelViewSet):
filter_backends = (filters.DjangoFilterBackend,)
filter_fields = ('categoria', 'categoria__titulo',)
示例:
URL?categoria__titulo=Categoria 1
答案 1 :(得分:7)
它也可以提供您自己的过滤器类,这可能会为您提供更多选择和灵活性
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']
}
在这个例子中我有过滤器
created__lt = 2015年9月22日 17:39:01.184681(所以我可以按值减去日期时间)
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
答案 2 :(得分:3)
对我来说,当我将逗号放在filter_fields的末尾时,它会起作用。
例如
filter_fields = ('distribuidor',)