class PostViewSet(ModelViewSet):
serializer_class = PostSerializer
queryset = Post.objects.all()
filter_backends = [DjangoFilterBackend]
filter_class = PostFilter
class ProfileViewSet(ModelViewSet):
serializer_class = ProfileSerializer
queryset = Profile.objects.all()
filter_backends = [DjangoFilterBackend]
filter_class = ProfileFilter
먼저 뷰를 viewset으로 리팩토링 해줬다. CRUD를 직접 정의안해줘도 알아서 장고에서 구현해줘서
너무나 편리하고 신기했다. 전에는 코드가 꽤 길었는데 viewset으로 사용하니까 두줄만 써도 POST, GET, PUT, DELETE
이 다 작동되었다.
class PostFilter(FilterSet):
title = filters.CharFilter(field_name='title', lookup_expr="icontains")#해당 문자열을 포함하는 queryset
content_null = filters.BooleanFilter(field_name='content', method='is_content_null')#true 시에 content가 null인것만 출력
class Meta:
model = Post
fields = ['title', 'content']
def is_content_null(self, queryset, content, value):
if value:
return queryset.filter(content__isnull=True)
else:
return queryset.filter(content__isnull=False)
class ProfileFilter(FilterSet):
nickname = filters.CharFilter(field_name='nickname')
class Meta:
model = Profile
fields = ['nickname']
처음에는 꼭 전체 단어를 검색해야지 해당 queryset을 가져올 수 있었는데
lookup_expr="icontains"를 포함했더니 해당 단어의 특정 문자열만 검색해도 queryset을 반환할 수 있었다.
lookup_expr는 필터링 할 때 필드를 가져온다. 장고에서 __구문 은 조회된 결과의 조건에 대한 변환을 지원 한다.
기본값은 'iexact'이고 이외에도 'isnull', 'in'도 있다.
[GET] http://127.0.0.1:8000/api/profiles
[
{
"user": 1,
"nickname": "cherry",
"introduction": "heyyyyyyy"
},
{
"user": 2,
"nickname": "choco",
"introduction": "멍멍"
},
{
"user": 3,
"nickname": "backend",
"introduction": "후후"
}
]
[GET] http://127.0.0.1:8000/api/profiles/?nickname=chaeri
[
{
"user": 1,
"nickname": "cherry",
"introduction": "heyyyyyyy"
}
]
[GET] http://127.0.0.1:8000/api/posts/?title=choco
[
{
"author": 3,
"title": "chocolate",
"content": "",
"author_nickname": "choco",
"created_at": "2021-11-19T01:24:00.405420+09:00",
"updated_at": "2021-11-19T01:43:41.202731+09:00",
"post_like": [],
"post_comment": []
},
{
"author": 3,
"title": "chococo",
"content": null,
"author_nickname": "choco",
"created_at": "2021-11-19T01:26:15.250002+09:00",
"updated_at": "2021-11-19T01:26:15.250002+09:00",
"post_like": [],
"post_comment": []
}
]
[GET] http://127.0.0.1:8000/api/posts/?content_null=true
[
{
"author": 3,
"title": "chococo",
"content": null,
"author_nickname": "choco",
"created_at": "2021-11-19T01:26:15.250002+09:00",
"updated_at": "2021-11-19T01:26:15.250002+09:00",
"post_like": [],
"post_comment": []
},
{
"author": 1,
"title": "hungry",
"content": null,
"author_nickname": "cherry",
"created_at": "2021-11-19T01:52:46.304923+09:00",
"updated_at": "2021-11-19T01:52:46.304923+09:00",
"post_like": [],
"post_comment": []
}
]
[GET] http://127.0.0.1:8000/api/posts/?content_null=true&title=choco
[
{
"author": 3,
"title": "chococo",
"content": null,
"author_nickname": "choco",
"created_at": "2021-11-19T01:26:15.250002+09:00",
"updated_at": "2021-11-19T01:26:15.250002+09:00",
"post_like": [],
"post_comment": []
}
]