from rest_framework import routers
from rest_framework_nested import routers as nested_routers
from . import views
router = routers.DefaultRouter()
router.register(r'posts', views.PostViewSet, basename='post')
# Nested router for comments under posts
posts_router = nested_routers.NestedDefaultRouter(router, r'posts', lookup='post')
posts_router.register(r'comments', views.CommentViewSet, basename='post-comments')
urlpatterns = router.urls + posts_router.urls
from rest_framework import viewsets
from blog.models import Post, Comment
from .serializers import PostSerializer, CommentSerializer
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
class CommentViewSet(viewsets.ModelViewSet):
serializer_class = CommentSerializer
def get_queryset(self):
# Filter comments by post_pk from URL
return Comment.objects.filter(post_id=self.kwargs['post_pk'])
def perform_create(self, serializer):
# Set post from URL parameter
post = Post.objects.get(pk=self.kwargs['post_pk'])
serializer.save(post=post, author=self.request.user)
Nested routers create hierarchical URL structures for related resources. I use drf-nested-routers to define parent-child relationships in URLs like /posts/1/comments/. This makes APIs more RESTful and intuitive. I filter child resources by parent ID in viewsets. For deep nesting, I limit to 2-3 levels for simplicity. Nested routes make relationships explicit in URLs. I use parent_lookup_kwargs to extract parent IDs. This pattern works well for one-to-many and many-to-many relationships.