django rest框架过滤器
Posted
技术标签:
【中文标题】django rest框架过滤器【英文标题】:django rest framework filter 【发布时间】:2014-02-17 21:38:18 【问题描述】:我正在使用由 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',)
使用类别字段过滤 url 的 API
如果我将过滤器添加到查询参数中,结果集不会改变,它显示所有未过滤的数据。
...establecimiento?establecimiento=bar
我怎样才能为这个模型制作这个过滤器?
【问题讨论】:
【参考方案1】:对我来说,当我将逗号放在 filter_fields 的末尾时,它就可以工作。
例如。
filter_fields = ('distribuidor',)
【讨论】:
看起来他们已经在这样做了。不确定您的解决方案是否添加了任何内容。 这对我有用。我有一个只有 1 项的元组。没有意识到我的元组上少了一个逗号。【参考方案2】:也可以提供您自己的 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']
在这个例子中我得到了过滤器
-
海报 = 1
tasker = 115
状态 = O
创建__lt=2015-09-22 17:39:01.184681(所以我可以按 LESS THEN 值过滤日期时间)
created__gt=2015-09-22 17:39:01.184681(或大于提供 值)
我还可以使用自定义过滤器字段隐藏外国字段,在本例中是 tag 和 university。另外我可以提供比较运算符(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】:您需要定义过滤器后端和您计划过滤的所有相关字段:
class EstablecimientoViewSet(viewsets.ModelViewSet):
filter_backends = (filters.DjangoFilterBackend,)
filter_fields = ('categoria', 'categoria__titulo',)
示例:
URL?categoria__titulo=Categoria 1
【讨论】:
非常感谢您的帮助:D 这对我不起作用。我正在使用 Django 1.7。您确定过滤器字段和后端也可以与 ModelViewset 一起使用吗?这与泛型的 APIListview 完美配合。 在我使用 DJango 1.7 的情况下,我得到了Meta.fields contains a field that isn't defined on this FilterSet
也使用模型视图集
@psychok7,您必须在元组 filter_fields 的末尾添加一个逗号。这样做为我解决了问题。以上是关于django rest框架过滤器的主要内容,如果未能解决你的问题,请参考以下文章
如何将过滤器应用于 Django REST 框架中的嵌套资源?