web-dev-qa-db-ja.com

django rest framework filter

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
_

このモデルについてこのフィルターを作成するにはどうすればよいですか?

23
user3236034

フィルターバックエンドと、フィルター対象のすべての関連フィールドを定義する必要があります。

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

例:

URL?categoria__titulo=Categoria 1
32
mariodev

また、独自の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. タスク担当者= 115
  3. ステータス= O
  4. created__lt = 2015-09-22 17:39:01.184681(だから、値を少なくして日時をフィルタリングできます)

  5. created__gt = 2015-09-22 17:39:01.184681(またはGREATER THAN提供値)

また、カスタムフィルターフィールドで外部フィールドを非表示にすることもできます。この場合は、tagniversityです。さらに、比較演算子を提供できます(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
7
DmitrySemenov

私にとっては、filter_fieldsの最後にコンマを置くと機能します。

例えば。

filter_fields = ('distribuidor',)
3
Thiago Soares