Django REST Framework와 ViewSet, Filter 활용하기
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()
router = routers.DefaultRouter()
router.register(r'posts', PostViewSet)
router.register(r'comments', CommentViewSet)
urlpatterns = router.urls
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,
})
__
지정한 문자열을 포함하는 자료 검색
queryset.filter(title__contains='hi')
queryset.filter(title__icontains='hi')
icontains는 대소문자 구별 X
정확히 일치하는 자료 검색
queryset.filter(title__exact='hi')
queryset.filter(title__iexact='hi')
iexact는 대소문자 구별 X
비교 연산을 통한 자료 검색
gt (greater than) : >
lt (less than) : <
gte (greater than or equal) : >=
lte (less than or equal) : <=
queryset.filter(id__gt=1)
지정한 문자열로 시작하는[끝나는] 자료 검색
queryset.filter(title__startswith='hihi')
queryset.filter(title__istartswith='hihi')
istartswith는 대소문자 구별 X
View를 계속해서 리팩토링하는 과정에서 코드가 점점 짧아지고, 한 눈에 들어오는 것을 보면서 장고는 정말 편리하다는 것을 다시금 느꼈다!
시험이 껴있어서 permission과 validation을 구현하지 못했는데 다음 주 과제에는 꼭 완성해보고싶다 🤓