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
'IT > Django' 카테고리의 다른 글
Django migration 파일에서 외부파일 오류 (0) | 2022.04.15 |
---|---|
Django migration 파일들 합치기(migrations squash) (0) | 2022.04.12 |
Django migrate sqlite to postgresql 마이그레이션 (0) | 2021.11.04 |
django backend와 frontend 통신 시 쿼리파라미터 boolean 처리 방법. (0) | 2021.07.27 |
Django-allauth custom template을 넘어서 custom context template. (0) | 2021.04.13 |