Django

Django Filterset 활용하기

r잡초처럼 2023. 3. 13. 02:17

Django에서는 Search 기능이나 Filter 기능을 제공해 준다. 여기서 다양한 lookup을 사용할 수 있다. queryset과 거의 유사하게 제공해 주기 때문에 기능을 구현하는 게 직관적으로 쉬웠다. 나는 exclude를 구현하고 싶었다. 

 

코드는 다음과 같다. views.py:

from django_filters.rest_framework import DjangoFilterBackend

class FooView(viewsets.ReadOnlyModelViewSet):
    filter_backends = [..., DjangoFilterBackend, ...]
    filterset_class = PlantFilter  # legacy 에선 filter_class 로 되어있어서 간혹 stackoverflow 에서 코드를 그대로 쳤다가 적용이 안되는 경우가 있다. (내얘기다.)

PlantFilter 는 filter.py 라는 모듈을 둬서 구현했다.

filter.py:

class PlantFilter(django_filters.FilterSet):
    foo__not__in = django_filters.BaseInFilter(
        field_name="model.field_name", exclude=True
    )


    class Meta:
        model = RenewablePlantsRaw
		fields = {
        	"foo": ["exact"],
        }

그리고 아래와 같이 요청을 하면 exclude__in  과 같은 결과 값이 나온다.

/?foo__not__in=1,2,3,4,6,7
# 결과
[{
    "id": 40939,
    "bar": "5",
}, {
    "id": 72911,
    "bar": "8",
}]