현제의 현재이야기
[0130 TIL]Django REST Framework 핵심사항 본문
- 모델을 상속받을 때는 modelserializer를 사용하고 직접 필드를 정의할 때는 그냥 serializer를 사용한다.
- Nested serializer 사용하는 법: 두 개의 시리얼라이저를 만들고 이렇게 many=True로 묶어둔다.
serializers.py
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = ['name']
class TagSerializer(serializers.ModelSerializer):
class Meta:
model = Tag
fields = ['name']
# class CateTagSerializer(serializers.Serializer):
# cateList = CategorySerializer(many=True)
# tagList = TagSerializer(many=True)
class CateTagSerializer(serializers.Serializer):
cateList = serializers.ListField(child=serializers.CharField())
tagList = serializers.ListField(child=serializers.CharField())
views.py
class CateTagAPIView(APIView):
def get(self, request, *args, **kwargs):
cateList = Category.objects.all()
tagList = Tag.objects.all()
data = {
'cateList': cateList,
'tagList': tagList,
}
serializer = CateTagSerializer(instance=data)
return Response(serializer.data)
urls.py
from django.urls import path
from api2 import views
urlpatterns = [
# path('post/', views.PostListAPIView.as_view(), name='post-list'),
# path('post/<int:pk>/', views.PostRetrieveAPIView.as_view(), name='post-detail'),
# path('comment/', views.CommentCreateAPIView.as_view(), name='comment-list'),
# path('post/<int:pk>/like/', views.PostLikeAPIView.as_view(), name='post-like'),
# path('catetag/', views.CateTagAPIView.as_view(), name='catetag'),
path('post/', views.PostViewSet.as_view(actions={
'get': 'list',
}), name='post-list'),
path('post/<int:pk>/', views.PostViewSet.as_view(actions={
'get': 'retrieve',
}), name='post-detail'),
path('post/<int:pk>/like/', views.PostViewSet.as_view(actions={
'get': 'like',
}), name='post-like'),
path('comment/', views.CommentViewSet.as_view(actions={
'post': 'create',
}), name='comment-list'),
path('catetag/', views.CateTagAPIView.as_view(), name='catetag'),
]
- 시리얼라이저에서 카테고리의 pk가 아니라 이름을 얻고 싶으면 (source='~~.~~')를 이용해서 오버라이딩한다.
class PostListSerializer(serializers.ModelSerializer):
category = serializers.CharField(source='category.name')
class Meta:
model = Post
# fields = '__all__'
fields = ['id', 'title', 'image', 'like', 'category']
- 시리얼라이저를 안 쓰는 것도 가능하다.
class PostRetrieveAPIView(RetrieveAPIView):
# queryset = Post.objects.all()
# serializer_class = PostSerializerDetail
def get_queryset(self):
return Post.objects.all().select_related('category').prefetch_related('tags', 'comment_set')
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
# prevInstance, nextInstance = get_prev_next(instance)
commentList = instance.comment_set.all()
postDict = obj_to_post(instance)
prevDict, nextDict = prev_next_post(instance)
commentDict = [obj_to_comment(c) for c in commentList]
dataDict = {
'post': postDict,
'prevPost': prevDict,
'nextPost': nextDict,
'commentList': commentDict,
}
return Response(dataDict)
select_related('')와 prefetch_related()에 대한 설명
_set의 의미
article = Article.objects.get(pk=?)
article.comment_set.all()
= Article.objects.get(pk=?).comment_set.all()
출처: https://coder-in-war.tistory.com/entry/Python-06-Django-relation-1N-복습
다 듣긴 했는데 한번 만들어보면서 익혀봐야겠다. 공식 문서 참조해서 오버라이딩 하는 게 좀 빡세보이지만 코드 예쁘게 짜서 이번 프로젝트에 적용시켜 보고 싶다.
Nested serializer 쉬운 방법
https://ninefloor-design.tistory.com/257
'DRF' 카테고리의 다른 글
[TIL] Many to Many에 대한 고찰 (0) | 2023.01.30 |
---|---|
[0129 TIL]Django REST Framework 핵심사항 (0) | 2023.01.30 |
DRF 공부 (0) | 2023.01.15 |
Comments