| Generic | Viewsets | |
|---|---|---|
| 코드량 | 중간 | 가장 적음 |
| URL 설정 | 직접 설정 | 자동 생성 |
| 난이도 | 중간 | 조금 더 복잡 |
| 유연성 | 높음 | 중간 |
# views.py
from rest_framework.generics import ListCreateAPIView
class TodoListCreate(ListCreateAPIView):
queryset = Todo.objects.all()
serializer_class = TodoSerializer
class TodoDetail(RetrieveUpdateDestroyAPIView):
queryset = Todo.objects.all()
serializer_class = TodoSerializer
# urls.py - URL 직접 설정해야 함
urlpatterns = [
path("todo/", TodoListCreate.as_view()), # 목록+생성
path("todo/<int:pk>/", TodoDetail.as_view()), # 조회+수정+삭제
]
URL이 2개 필요!
/todo/ → 목록, 생성
/todo/1/ → 조회, 수정, 삭제
# views.py
from rest_framework.viewsets import ModelViewSet
class TodoViewSet(ModelViewSet):
queryset = Todo.objects.all()
serializer_class = TodoSerializer
# 이게 끝! CRUD 전부 자동으로 만들어짐
# urls.py - Router가 URL 자동 생성
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register("todo", TodoViewSet)
urlpatterns = [
path("", include(router.urls)), # URL 자동 생성!
]
URL이 자동으로 생성됨!
/todo/ → GET(목록), POST(생성)
/todo/1/ → GET(조회), PUT(수정), DELETE(삭제)
함수형 뷰 (1단계)
──────────────────
def todo_list(request):
if request.method == "GET":
...
elif request.method == "POST":
...
# 코드가 길고 반복이 많음 ❌
↓
Generic (2단계)
──────────────────
class TodoListCreate(ListCreateAPIView):
queryset = Todo.objects.all()
serializer_class = TodoSerializer
# 코드가 줄어듦 ✅
↓
Viewsets (3단계)
──────────────────
class TodoViewSet(ModelViewSet):
queryset = Todo.objects.all()
serializer_class = TodoSerializer
# 코드가 최소화됨 ✅✅
Generic 사용 Viewsets 사용
─────────────────────────────────────────
일부 기능만 필요할 때 CRUD 전부 필요할 때
URL 커스텀이 필요할 때 빠르게 개발할 때
세밀한 제어가 필요할 때 코드를 줄이고 싶을 때
Generic → "필요한 기능만 골라서 사용"
Viewsets → "CRUD 전부 한번에 자동으로!"
둘 다 같은 결과지만 Viewsets이 코드가 훨씬 짧아요! 😊