본문 바로가기

소프트웨어-이야기/프로그래밍 언어와 프레임워크

(Django) Rest Frame Work Filter 활용하기

FilterBackend 사용하기

ViewSet에서 Request 파라미터로 받은 값이랑 일치하는 데이터를 조회해야할 때, 아래처럼 일일히 파라미터를 받아다가, filter 조건에 추가해줘야한다. 

class ProductList(generics.ListAPIView):
    serializer_class = PurchaseSerializer

    def get_queryset(self):
        """
        This view should return a list of all the purchases for
        the user as determined by the username portion of the URL.
        """
        category = self.kwargs['category']
        in_stock = self.kwargs['in_stock']
return Purchase.objects.filter(category=category,in_stock=in_stock)


그런데 Rest Frame Work Filter 기능을 사용하면, VIEWSET에 filter_backends, filter_fields만 명시해주면 된다. 

class ProductList(generics.ListAPIView):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    filter_backends = (DjangoFilterBackend,)
    filter_fields = ('category', 'in_stock')

필터조건으로 사용할 필드명들을 filter_fields에 추가해줘야한다. 


http://example.com/api/products?category=clothing&in_stock=True
API 파라미터는 위의 예시처럼 보내주면 된다. 



FilterSet 만들어서 사용하기

파라미터명과 필터 조건 키가 다른 경우, 아래처럼 FilterSet Class를 만들어서 사용하면 된다.
FilterSet에 새로운 파라미터에 맞는 필터 조건을 명시해줘야한다. 

from rest_framework import generics
from django_filters import rest_framework as filters
from myapp import Product


class ProductFilter(filters.FilterSet):
    min_price = filters.NumberFilter(field_name="price", lookup_expr='gte')
    max_price = filters.NumberFilter(field_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,)
    filterset_class = ProductFilter

참고

DJNAGO REST FRAMEWORK - DjangoFitlerBackend

Integration with DRF