【问题标题】:django rest framework filterdjango rest框架过滤器
【发布时间】: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

我怎样才能为这个模型制作这个过滤器?

【问题讨论】:

    标签: python django django-rest-framework django-filter


    【解决方案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. 海报 = 1
    2. tasker = 115
    3. 状态 = O
    4. 创建__lt=2015-09-22 17:39:01.184681(所以我可以按 LESS THEN 值过滤日期时间)

    5. 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 的末尾添加一个逗号。这样做为我解决了问题。
      猜你喜欢
      • 2012-12-24
      • 2017-05-27
      • 2017-10-26
      • 2018-05-17
      • 2017-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多