-
[Django django-filter] Django Rest Framework언어/파이썬 & 장고 2016. 9. 26. 15:50
Django Rest Framework의 통합은 DRF-특정 FilterSet 및 filter backend를 통해 제공됩니다. 이것들은 rest_framework 서브 패키지에서 찾을 수 있습니다.
Quickstart
새로운 FilterSet을 사용하면 import path를 변경해야합니다. django_filters를 import하는 것 대신 rest_framework 서브 패키지를 import 해야합니다.
from django_filters import rest_framework as filters class ProductFilter(filters.FilterSet): ...
사용자의 view 클래스는 또한 filter_backends에 DjangoFilterBackend추가하는 것을 필요로 합니다.
from django_filters import rest_framework as filters class ProductList(generics.ListAPIView): queryset = Product.objects.all() serializer_class = ProductSerializer filter_backends = (filters.DjangoFilterBackend,) filter_fields = ('category', 'in_stock')
만약 사용자는 기본으로 django-filter backend 사용하기를 원한다면 settings.py에 DEFAULT_FILTER_BACKENDS을 추가하면 됩니다.
# settings.py REST_FRAMEWORK = { 'DEFAULT_FILTER_BACKENDS': ( 'django_filters.rest_framework.DjangoFilterBackend', ... ), }
Adding a FilterSet with filter_class
FilterSet으로 필터링을 사용하려면, view 클래스에 filter_class 매개 변수에 추가합니다.
from rest_framework import generics from django_filters import rest_framework as filters from myapp import Product class ProductFilter(filters.FilterSet): min_price = django_filters.NumberFilter(name="price", lookup_expr='gte') max_price = django_filters.NumberFilter(name="price", lookup_expr='lte') class Meta: model = Product fields = ['category', 'in_stock', 'min_price', 'max_price'] class ProductList(generics.ListAPIView): queryset = Product.objects.all() serializer_class = ProductSerializer filter_backends = (filters.DjangoFilterBackend,) filter_class = ProductFilter
Specifying filter_fields
사용자는 view 클래스에 filter_fields를 추가하여 FilterSet 생성을 우회할 수 있습니다. 이것은 Meta.fields.를 가지는 FilterSet을 생성하는 것과 동일합니다.
from rest_framework import generics from django_filters import rest_framework as filters from myapp import Product class ProductList(generics.ListAPIView): queryset = Product.objects.all() filter_backends = (filters.DjangoFilterBackend,) filter_fields = ('category', 'in_stock') # Equivalent FilterSet: class ProductFilter(filters.FilterSet): class Meta: model = Product fields = ('category', 'in_stock')