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",
}]
'Django' 카테고리의 다른 글
django-import-export 비동기 활용하기 (0) | 2023.04.13 |
---|---|
E2E 테스트할 때 외부 API Mock으로 대체하기 (0) | 2023.03.16 |
Django staticfile 관리하기 (0) | 2023.03.01 |
[DRF] Serializer relations (0) | 2023.02.26 |
[DRF] create vs perform_create (0) | 2023.02.24 |