CEOS 6주차 - Django REST Framework(3) / ViewSet & Filter

diveintoo·2022년 5월 15일
0

CEOS

목록 보기
6/6

CEOS 15th 백엔드 6주차 과제 공부기록

Django REST Framework와 ViewSet, Filter 활용하기

Viewset으로 리팩토링하기

Post, Comment Viewset

class PostViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    serializer_class = PostSerializer
    queryset = Post.objects.all()
    filter_backends = [DjangoFilterBackend]
    filterset_class = PostFilter

class CommentViewSet(viewsets.ModelViewSet):
    serializer_class = CommentSerializer
    queryset = Comment.objects.all()

url 매핑

router = routers.DefaultRouter()
router.register(r'posts', PostViewSet)
router.register(r'comments', CommentViewSet)

urlpatterns = router.urls

filter 기능 구현하기

PostFilter

class PostFilter(FilterSet):
    user = filters.CharFilter(method='filter_user')
    content = filter.CharFilter(field_name='content', lookup_expr='icontains')

    class Meta:
        model = Post
        fields = ['user', 'content']

    def filter_user(self, queryset, name, value):
        return queryset.filter(**{
            name: value,
        })

공부한 내용 정리

filter()의 조건 키워드

키워드 앞에 쓰이는 __

  • 조건을 사용할 떄
  • 외부 모델 필드를 사용할 때

contains / icontains

지정한 문자열을 포함하는 자료 검색

queryset.filter(title__contains='hi')

queryset.filter(title__icontains='hi') icontains는 대소문자 구별 X

exact / iexact

정확히 일치하는 자료 검색

queryset.filter(title__exact='hi')

queryset.filter(title__iexact='hi') iexact는 대소문자 구별 X

gt / lt / gte / lte

비교 연산을 통한 자료 검색

gt (greater than) : >

lt (less than) : <

gte (greater than or equal) : >=

lte (less than or equal) : <=

queryset.filter(id__gt=1)

startswith / endswith

지정한 문자열로 시작하는[끝나는] 자료 검색

queryset.filter(title__startswith='hihi')

queryset.filter(title__istartswith='hihi') istartswith는 대소문자 구별 X

간단한 회고

View를 계속해서 리팩토링하는 과정에서 코드가 점점 짧아지고, 한 눈에 들어오는 것을 보면서 장고는 정말 편리하다는 것을 다시금 느꼈다!

시험이 껴있어서 permission과 validation을 구현하지 못했는데 다음 주 과제에는 꼭 완성해보고싶다 🤓

0개의 댓글