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
'소프트웨어-이야기 > 프로그래밍 언어와 프레임워크' 카테고리의 다른 글
(Django) Django ORM에서 Row Lock 잡기 - select_for_update (2) | 2018.12.15 |
---|---|
(Django) Django로 e-commerce 개발할 때 참고하기 좋은 오픈소스 (0) | 2018.10.20 |
(Django) DB Connection을 관리하는 방법 (0) | 2018.08.04 |
(django) get_XXX_display 함수 : 모델의 속성 값을 사람이 읽을 수 있는 문장으로 변환하기 (0) | 2018.07.14 |
(django) 자주 사용되는 queryset 모아서 관리하기 (0) | 2018.07.14 |