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(或大于提供 值)

我还可以使用自定义过滤器字段隐藏外国字段,在本例中是 taguniversity。另外我可以提供比较运算符(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框架按日期时间过滤

如何将过滤器应用于 Django REST 框架中的嵌套资源?

在Django rest框架中过滤给定距离内的用户

带有视图集路由器查询集过滤器的 Django REST 框架

Django REST框架外键和过滤

如何使用 objects.filter() 将字典过滤为 django rest 框架中的 POST 方法