drf에서 제공하는 Ordering Filter 기능을 커스텀했다. 공식 문서는 요기
문제 상황
ordering 을 하는 과정에서 null 값이 존재하는 경우 정렬 순서를 맨 끝으로 보내야 했다. 따라서 OrderingFilter 의 filter_queryset을 override 하기로 했다.
param은 "-" 의 경우 내림 차순이므로 맨 앞글자를 검사해서 "-" 있을 경우 내림 차순 표현식으로 만들고 아닌 경우 오름차순으로 만들었다. 밑에는 해당 코드이다.
class FooOrdering(OrderingFilter):
@staticmethod
def nullish_ordering(field: str) -> F:
"""
ordering 에서 오름차순 혹은 내림차순으로 변경하고 이때 null이 맨 마지막으로 오도록 하는 함수
"""
if "-" == field[0]:
return F(field[1:]).desc(nulls_last=True)
return F(field).asc(nulls_last=True)
def filter_queryset(self, request, queryset, view):
ordering = self.get_ordering(request, queryset, view)
if ordering:
ordering = [self.nullish_ordering(x) for x in ordering]
return queryset.order_by(*ordering)
return queryset
'Django' 카테고리의 다른 글
Django Channels - Consumer 살펴보기 (0) | 2023.05.05 |
---|---|
WebSocket 살펴보기 - 2 (0) | 2023.05.05 |
django-import-export 비동기 활용하기 (0) | 2023.04.13 |
E2E 테스트할 때 외부 API Mock으로 대체하기 (0) | 2023.03.16 |
Django Filterset 활용하기 (0) | 2023.03.13 |