Django rest框架fi

2024-09-23 00:24:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用由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',) 使用category字段筛选url的API

如果将筛选器添加到查询参数,则结果集不会更改,它将显示所有未筛选的数据。

...establecimiento?establecimiento=bar

我怎样才能对这个模型进行筛选?


Tags: 文件frompyimportrestapifieldsmodels
3条回答

对我来说,当我把逗号放在filter_字段的末尾时,它就起作用了。

例如

filter_fields = ('distribuidor',)

还可以提供自己的过滤器类,这可能会给您更多的选择和灵活性

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. 任务=115
  3. 状态=O
  4. 创建日期=2015-09-22 17: 39:01.184681(这样我就可以按小于该值的值过滤datetime)

  5. 创建时间=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

您需要定义筛选后端和计划筛选的所有相关字段:

class EstablecimientoViewSet(viewsets.ModelViewSet):
    filter_backends = (filters.DjangoFilterBackend,)
    filter_fields = ('categoria', 'categoria__titulo',)

示例:

URL?categoria__titulo=Categoria 1

相关问题 更多 >