Dev./Django & DRF

Django : DRF 적용하기2

Ivan'show 2023. 8. 16.
728x90
반응형

Forumapp DRF

DRF 의 핵심은 serializing 을 아주 간단하게 하는 라이브러리들을 쓸 수 있다는 점이다.

  • 모델을 정의해서 models.Models 로 상속 받아서 사용
  • rest_framework 를 설치해서 serializers 에 적용
  • serializer.ModelSerializer 를 상속받아 ModelSerializer 생성
  • view 에서 해당 시리얼라이저를 사용하여 클래스를 만들고 ModelViewSet 을 상속
  • 마지막으로 urls 에 router 로 연결해줌
  • model 설정 → models.Model 상속
  • serializer 설정 → request 와 response 를 프레임 워크로 바로 바로 JSON 형식으로 바꿔서 보내고 받을 수 있게 해주는 설정
  • views 설정 → rest_framework 라이브러리에서 viewsets 을 상속받아서 사용하기 떄문에 queryset 과 시리얼라이저 클래스를 설정해줌
  • urls 설정 → 기존에 사용하던 path 방식이 아닌 route 방식으로 컨트롤 해줌

models.py

from django.db import models
from django.contrib.auth.models import User

# Create your models here.
class Topic(models.Model):
    # postgres 를 사용할 예정이기 때문에 -> postgres 에서는 Text 와 Char 를 같게 취급 
    # 그래서 스트링을 다루는 곳에서는 Text 사용 - 공식문서
    name = models.TextField(max_length=100, unique=True)
    is_private = models.BooleanField(default=False)
    owner = models.ForeignKey(User, on_delete=models.PROTECT)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name
    

class Post(models.Model):
    topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
    title = models.TextField(max_length=200)
    content = models.TextField()
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title

serializers.py

from rest_framework import serializers
from .models import Topic, Post

class TopicSerializer(serializers.ModelSerializer):
    # 모델을 시리얼라이져로 가져올 때는 Meta 를 정의
    class Meta: # 어떤 모델을, 어떤 필드를 가져올지
        model = Topic
        fields = "__all__"
        
        # 유저가 수정하면 안되는 부분들을 정리
        read_only_fields =(
            "id",
            "created_at",
            "updated_at",
        )

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = "__all__"

        read_only_fields =(
            "id",
            "created_at",
            "updated_at",
        )

views.py

from rest_framework import viewsets

from .models import Topic, Post
from .serializers import TopicSerializer, PostSerializer

# 모델 뷰셋 사용
class TopicViewSet(viewsets.ModelViewSet):
    # 어떤 모델 오브젝트를 쓸꺼니? 
    # all() -> create ~ list ~ 전부 알아서 작성됨
    queryset = Topic.objects.all()
    # 어떤 시리얼라이저 쓸꺼니?
    serializer_class = TopicSerializer

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

urls.py

from rest_framework.routers import DefaultRouter
from . import views

router = DefaultRouter()
router.register('topic', views.TopicViewSet, basename='topic')
router.register('post', views.PostViewSet, basename='post')

project - urls.py

from django.contrib import admin
from django.urls import path, include

# from blog.urls import urlpatterns as blog_urls
from blog.urls import router as blog_router
from forumapp.urls import router as forum_router

urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include(blog_router.urls)),
[](<https://www.notion.so/2023-08-09-8bef24b5985b424ea1ffa37617601436?pvs=21>)    path('forum/', include(forum_router.urls)),
    path('api-auth/', include('rest_framework.urls')),
]
728x90
반응형

'Dev. > Django & DRF' 카테고리의 다른 글

[Cloud] Django: Code develop for TEST2  (0) 2023.08.31
Django : DRF 적용하기3 - Spectacular  (0) 2023.08.16
Django : DRF 적용하기  (0) 2023.08.15
Django : DRF - quick start  (0) 2023.08.15
Django : 시작하기  (0) 2023.08.09

댓글