IT/Django

DRF in필터 만들기 (django-filter IntegerField multiple parameter )

bepuri 2022. 1. 11. 13:02
728x90

DRF와 파생된 ecosystem은 너무나도 방대해서 사실상 모든걸 파악하기란 불가능에 가깝다.

그때 그때 마다 적합한 것을 찾아서 적용하는 수 밖에는 없다.

django-filter를 사용하면 생각보다 간단하게 drf 기반 서비스에서 필터링 기능을 적용할 수 있다.

기본적으로 fields 옵션을 통해서 자동으로 필터를 생성할 수 있다.

class UserFilter(django_filters.FilterSet):
    class Meta:
        model = User
        fields = ['username', 'last_login']

하지만 위와 같은 상황외에 lt나 gte를 적용해 대소 비교를해야 한다면 아래와 같이 dictionary 형태로 추가적인 적용이 가능하다.

class UserFilter(django_filters.FilterSet):
    class Meta:
        model = User
        fields = {
            'username': ['exact', 'contains'],
            'last_login': ['exact', 'year__gt'],
        }

여기서 좀 더 나아가 IntegerField를 가진 모델에서 1개의 값이 아닌 여러 값을 동시에 filtering 하고 싶은 상황이 있을 수 있다. 내 경우는 item에 category가 있었고 여러개의 카테고리에 만족되는 모든 item을 출력하는 필터링 기능을 만들고 싶었다.
문서상으로는 dictionary fields를 통해서 가능해야했는데 정상적으로 동작하지 않았다.

따라서 아래와 같이 BaseInFilter를 상속받은 _NumberInFilter를 정의했다.

class _NumberInFilter(BaseInFilter, NumberFilter):
    pass

이후 해당 클래스를 상속받은 필터를 정의했다.

class ListingFilter(django_filters.FilterSet):
    item_category = _NumberInFilter()

    class Meta:
        model = Listing
        fields = [
            "item_category",
        ]

위와 같이 정의 후

?item_category=1,2,3
request 전송시 위와같이 파라미터를 보내면 정상적으로 필터링 처리가 된 것을 확인할 수 있었다.

728x90