Python/DRF

[DRF] 게시판 기능(CRUD) 구현하기

emhaki 2023. 1. 17. 21:22
728x90
반응형
SMALL

이전에 ViewSets을 하면서 models.py에 아래와 같이 title과 body field를 생성했었다.

from django.db import models
from django.conf import settings

# Create your models here.

class Blog(models.Model):
  title = models.CharField(max_length=100)
  body = models.TextField()

하지만 블로그에는 이보다 더 많은 기능이 필요하기 때문에 기능을 더 추가하는 코드를 작성해보고자 한다. 게시글의 id값, 제목, 작성일, 작성자, 본문을 추가하는 코드는 다음과 같다.

models.py 

from django.db import models
from django.conf import settings
from accounts.models import User

# Create your models here.

class Blog(models.Model):
  # 1. 게시글의 id 값
  id = models.AutoField(primary_key=True, null=False, blank=False)
  # 2. 제목
  title = models.CharField(max_length=100)
  # 3. 작성일
  created_at = models.DateTimeField(auto_now_add=True)
  # 4. 작성자
  user = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE)
  # 5. 본문
  body = models.TextField()

작성자를 저장하기 위해서는 이전에 생성했던 accounts앱의 User 모델을 불러와줘야 한다. id의 경우에는 글 작성 시 id값을 자동으로 부여해주기 위해 AutoField를 사용했다. id값은 게시글을 구별하는 역할을 하기 때문에 primary key로 설정했다.

created_at은 글을 작성한 시간을 의미하며 Django에서 기본적으로 제공하고 있는 DateTimeField를 사용했다. 작성 시점을 자동으로 저장하기 위해 auto_now_add를 True로 설정했다. 

user는 현재 존재하고 있는 User 객체를 가리키기 위해 Foreign Key(외래키)로 구성했다. 만약 특정 글을 작성한 사용자 정보가 삭제된다면 게시글도 함께 삭제되도록 하기 위해, on_delete를 CASCADE로 설정해주었다. 만약에 게시글 삭제를 원치 않는다면 on_delete를 SET_NULL로 설정해주면 된다고 한다.

 

models.py가 변경되었으니 마이그레이션을 해준다.

python manage.py makemigrations
python manage.py migrate

views.py 

from .models import Blog
from .serializer import BlogSerializer
from rest_framework import viewsets

# Blog의 목록, detail 보여주기, 수정하기, 삭제하기 모두 가능
class BlogViewSet(viewsets.ModelViewSet):
    queryset = Blog.objects.all()
    serializer_class = BlogSerializer

    # serializer.save() 재정의
    def perform_create(self, serializer):
        serializer.save(user = self.request.user)

이전에 작성했던 코드에 def perform_create를 추가시켜준다. ViewSets에서 perform_create 메소드를 사용하게 되면 기존의 create 함수를 재정의할 수 있다. 

serializer.py

from .models import Blog
from rest_framework import serializers

class BlogSerializer(serializers.ModelSerializer):
    user = serializers.ReadOnlyField(source = 'user.nickname')
    class Meta:
        model = Blog
        fields = ['id','title', 'created_at', 'user', 'body']

views.py의 perform_create 메소드에서 user 값을 넘겨주었기 때문에, serializer에서 해당 값을 받아와야 한다.

ReadOnlyField를 사용해서 views.py에서 넘겨준 user의 nickname 값을 받아오기 위해 source='user.nickname'으로 설정했다.

python manage.py runserver

서버를 실행시켜서 설정해둔 blog url로 들어가게 되면 아래와 같은 화면이 나오고 title과 Body를 작성해 POST를 눌러주면

이와 같은 오류가 나오게 된다. 이유는 우리가 User 객체를 추가해주었는데, 로그인이 되어있지 않아 발생한 오류이다. 

로그인을 한 후 동일하게 POST를 하게 되면 우리가 생성했던 field들을 확인할 수 있다.

 

참고

https://wisdom-990629.tistory.com/m/entry/DRF-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0

728x90
반응형