📘 DRF - Generics 

  1. Generics?
  2. 주요 제네릭 클래스
  3. DRF Generics 사용 예시
  4. 커스터마이징 예시

📘 Generics?

Django REST Framework (DRF)에서의 Generics는
API View를 작성할 때, 자주 사용되는 CRUD 작업을 간단하게 처리할 수 있게 도와주는 클래스를 제공합니다.

📘 DRF Generics의 장점

  1. 코드 간소화
    • CRUD 작업을 처리하는 기본적인 로직을 제너릭 클래스가 자동으로 처리함
      → 반복적인 코드를 작성할 필요가 없음
  2. 유지보수 용이
    • 제너릭 클래스는 기본적인 기능을 잘 갖추어져 있음
      → 추가적인 복잡한 로직을 추가하는 것이 용이함
  3. 성능 최적화
    • 기본적인 뷰에 대한 최적화가 이미 되어 있음
      → 효율적인 API를 쉽게 작성할 수 있음

🔝


📘 주요 제네릭 클래스 ‼️

  API View 기능
1 ListAPIView 데이터를 목록 형태로 반환
2 CreateAPIView 데이터를 생성
3 ListCreateAPIView
목록 조회와 생성 기능을 동시에 처리
4 RetrieveAPIView 단일 객체 반환
5 UpdateAPIView 데이터를 수정
6 DestroyAPIView 데이터를 삭제
7 RetrieveUpdateDestroyAPIView 조회, 수정, 삭제 기능을 동시에 처리

🔝


📘 DRF Generics 사용 예시

아래는 DRF에서 Generics를 사용하는 간단한 예시입니다.

이 예시에서는 Book 모델에 대한 CRUD API를 작성합니다.

 

⚙️ models.py

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=100)
    published_date = models.DateField()

    def __str__(self):
        return self.title

 

⚙️ URL 설정

from django.urls import path
from .views import BookListView, BookDetailView

urlpatterns = [
    path('books/', BookListView.as_view(), name='book-list'), # 책 목록 확인
    path('books/<int:pk>/', BookDetailView.as_view(), name='book-detail'), # 책 상세 목록 확인
]

 

  • BookListView에서는 책 목록을 볼 수 있음과 동시에 생성하는 로직으로 구성할 거예요
  • BookDetailView에서는 특정 책의 내용과 수정, 삭제를 동시에 수행하는 로직으로 구성할 거예요

⚙️ Serializer 정의

from rest_framework import serializers
from .models import Book

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = ['id', 'title', 'author', 'published_date']
  • id, title, author, published_data를 다루게끔 설정하였어요

⚙️ View 정의 (Generics 사용)

from rest_framework import generics
from .models import Book
from .serializers import BookSerializer

# 책 목록을 조회하는 API 뷰
class BookListView(generics.ListCreateAPIView):
    queryset = Book.objects.all() # 어떤 데이터베이스 모델을 사용할지
    serializer_class = BookSerializer # 직렬화를 사용하여 데이터 처리

# 책을 상세 조회하는 API 뷰
class BookDetailView(generics.RetrieveUpdateDestroyAPIView):
    queryset = Book.objects.all() # 어떤 데이터베이스 모델을 사용할지
    serializer_class = BookSerializer # 직렬화를 사용하여 데이터 처리

 

  • BookListView는 책 목록을 조회하고, 새로운 책을 생성할 수 있는 API입니다.
    • generics.ListCreateAPIView를 통해서 구현 가능합니다.
  • BookDetailView는 특정 책을 조회하고, 수정하거나 삭제할 수 있는 API입니다.
    • generics.RetrieveUpdateDestroyAPIView를 통해서 구현 가능합니다.

🔗 왜 serializer_class를 정의하는가?

🔝


🤔 각 뷰에 대한 설명

  • BookListView (ListCreateAPIView):
    • GET 요청: 모든 책을 조회하여 리스트 형식으로 반환합니다.
    • POST 요청: 새로운 책을 생성합니다.
  • BookDetailView (RetrieveUpdateDestroyAPIView):
    • GET 요청: 특정 책의 정보를 조회합니다.
    • PUT/PATCH 요청: 특정 책의 정보를 수정합니다.
    • DELETE 요청: 특정 책을 삭제합니다.

📘 커스터마이징 예시

가끔 제너릭 뷰만으로는 충분하지 않을 수 있습니다.

이럴 경우, perform_create()get_queryset() 메서드를 오버라이드하여 추가적인 로직을 처리할 수 있습니다.

# views.py
class BookListView(generics.ListCreateAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    def perform_create(self, serializer):
        # 책을 생성할 때, 특정 로직을 추가 (예: 특정 작가로 책이 생성되는 것)
        serializer.save(author="Default Author")

 

이처럼, perform_create() 메서드를 오버라이드하면, 책이 생성될 때마다 특정 작가로 자동으로 설정될 수 있습니다.

🔝

🐾Recent posts