ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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')


    댓글