미해결
Django REST Framework 핵심사항
PostSerializerDetail serializer를 이용해 직렬화하고, 해당 ViewSet을 router를 통해 url 매핑을 한 후 api2/post/<int:pk>(get) 엔드포인트에 request를 하면 에러가 발생합니다.
* VueDjAgencyDrf-untilCh7-2의 api2/views.py에서 (프로그래머가 직접 직렬화하는 것이 아니라 VueDjAgencyDrf-untilCh6의) PostSerializerDetail serializer를 이용해 직렬화하고, 해당 ViewSet을 router를 통해 url 매핑을 하면 아래와 같은 에러가 발생합니다...
* 제가 추가한 코드는 다음과 같습니다.
# api2/urls.py
router = routers.DefaultRouter()
router.register(r'post', views.PostViewSet)
urlpatterns = [
...
path('', include(router.urls)),
...
]
# api2/views.py
def get_prev_next(instance):
try:
prev = instance.get_previous_by_update_dt()
except instance.DoesNotExist:
prev = None
try:
next_ = instance.get_next_by_update_dt()
except instance.DoesNotExist:
next_ = None
return prev, next_
class PostViewSet(ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostListSerializer
pagination_class = PostPageNumberPagination
def get_serializer_context(self):
return {
'request': None,
'format': self.format_kwarg,
'view': self
}
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()
data = {
'post': instance,
'prevPost': prevInstance,
'nextPost': nextInstance,
'commentList': commentList,
}
serializer = PostSerializerDetail(instance=data)
return Response(serializer.data)
* 그런데 이 이슈는 아래와 같이 router를 쓰지 않으면 발생하지 않고 정상 동작합니다.
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'),
* 어떻게 하면 PostSerializerDetail를 통해 직렬화하고 해당 ViewSet이 router를 이용하도록 하여도 에러가 나지 않을 수 있을까요?