-
Django Filters 에서 하나의 Key를 가지고 여러 값 필터하기 ( MultipleFilter )기술/Django 2021. 9. 24. 19:34
django-filters 에서 여러 값을 필터하는 방법으로는 몇가지 있습니다.
- BaseInFilter 로 key=value1,value2 같은 컴마로 구분하는 필터
- MultipleChoiceFilter 로 key=value1&key=value2 같은 키로 구분하는 필터
이 중에서 같은 키로 여러 값을 구분하기 위하여 MultipleChoiceFilter 를 커스텀합니다.
하지만 MultipleChoiceFilter 는 Choice 값이 있어야만하는 에러를 발생하고, 이를 범용성 있게 하고 싶었기 때문에 다른 필터 유틸을 만들게 되었습니다.
MultipleFilter
MultipleChoiceFilter 가 django-filters 라이브러리에서 제공하는 단 하나뿐인 다중 필터 입니다.
하지만 이름에서 보다시피 ChoiceField 에서만 동작했고 이것을 범용성있게 바꾸기 위해 내부 코드를 살펴보고 변경했습니다.
MultipleChoiceField
MultipleChoiceFilter 에서 field_class 의 validate 내에서 Choice 필드가 아니면 에러를 내는 코드가 존재해서 해당 부분을 없애야 했습니다.
from django_filters import fields class MultipleField(fields.MultipleChoiceField): """ MultipleChoiceField 가 Choice 필드에 대해서만 동작하기 때문에 Choice 가 없이도 동작하도록 validate 를 삭제하는 Field """ def valid_value(self, value): return True
MultipleChoiceFilter
Choice 를 검증하는 부분을 없앴다면 Filter 에 적용해야합니다.
from django_filters import rest_framework as filters class MultipleFilter(filters.MultipleChoiceFilter): field_class = MultipleField
다른 방식의 QueryString 을 허용하기
기본 MultipleChoiceFilter 는 ?key[]=value1&key[]=value2 의 방식만 사용 가능합니다.
다른 방식의 Query String 필터를 허용하기 위해서는 MultipleFilter 를 사용할 때 widget 을 제공해야 합니다.
QueryArrayWidget 을 적용하면 key=value1,value2, key=value1&key=value2 이 두 방식으로 필터링 가능하게 해줍니다.
class PostFilterSet(FilterSet): id = MultipleFilter( field_name='id', widget=QueryArrayWidget, )
'기술 > Django' 카테고리의 다른 글
django-filters 를 사용하여 복잡한 환경에서 OrderingFilter 사용하기 (0) 2021.09.24 Django 에서 일시적으로 auto_now, auto_now_add 를 disable 시키는 법 (0) 2021.09.24 Django 에서 String datetime 을 aware 한 datetime 으로 변경하는 방법 (0) 2021.09.24 Django 에서 Chain 필터 시 추가적인 테이블 JOIN 방지하기 ( + _next_is_sticky ) (0) 2021.09.24 Django Manager, Queryset (1) 2021.09.24