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=TrueAPI 파라미터는 위의 예시처럼 보내주면 된다.
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 모아서 관리하기 (1) | 2018.07.14 |