본문 바로가기
IT CHANNEL/Python

[DRF 게시판만들기] #2 Setting, Modeling

by TitanX 2022. 3. 6.
목차

1. basic Setting

 

2. Modeling(기본설계)

 

3. App 생성

 

4. Model생성

 

 

1. basic Setting

저는 m1 mac을 사용중이며 아래와 같은 환경에서 진행했습니다. 간단한 api 생성을 목적으로 하기 때문에 기본적인 프레임워크와 라이브러리만 사용하겠습니다.

  • 파이참(커뮤니티) IDE (파이참을 사용해서 프로젝트에 발생하는 라이브러리와 메소드를 단축키만으로 가볍게 설치 할 수 있는 등의 편리함이 있습니다.)
  • python ver 3.8
  • pip list 입니다. 터미널에서 아래의 명령어로 설치해줍니다.
# pip list

pip install django
pip install django_extensions
pip install djangorestframework
  • django-admin startproject [project_name]; 디렉토리 이동
python manage.py migrate
python manage.py runserver

locatlhost:8000 링크로 접속해서 아래와 같은 화면이 뜬다면 기본 django 세팅을 마쳤습니다.

2. Modeling(기본설계)

 

최종 목표는 drf로 아주 간단한 커뮤니티의 api 를 만드는 것입니다.

커뮤니티(게시판)에서 기본이자 중심인 모델을 정의하고, 그에 따라서 개발을 이어나가면 됩니다.

간단하게 아래의 app과 모델을 사용할 것입니다.

  • 먼저 게시판 서비스를 이용할 유저를 정의 해줍니다. 한 app 으로 정의하고 클래스를 별도로 모델을 정의해주어도 상관없지만, 기능의 확장성과 변경성을 위해서 다른 앱으로 분기하는 것이 좋다고 생각합니다.

3. App 생성

 

터미널에서 유저와 게시판 app을 만들어줍니다.

  • python manage.py startapp [시작할 app 이름]
python manage.py startapp user
python manage.py startapp board
  • settings의 INSTALLED APP에 rest_framework, user, board 를 넣어줍니다.

 

4. Model 생성

이제 정의한 모델 관계를 다시 생각해보고 생성해보겠습니다.

  1. User모델은 user에 관한 정보.
  2. Category 모델은 카테고리 이름.
  3. Post 모델은 게시글의 제목과 내용 + user와 category를 foreignkey 필드로 지정해서 user모델과 category 가 삭제되면 모델 인스턴스도 삭제되게 합니다.
    • 예를 들면, 게시판의 유저A가 여러개의 글을 작성했다고 할 때, 유저 A가 삭제될 경우 작성된 게시글도 삭제 되는 것입니다.
  4. 각 모델의 필드값을 지정할때 foreignkey 를 설정해서 종속관계를 나타내어 줄 수 있습니다.
  • user > models.py
from django.db import models

class User(models.Model):
    email = models.EmailField(verbose_name='이메일', unique=True)
    nickname = models.CharField(verbose_name='닉네임', max_length=8, null=False, unique=True)
    first_name = models.CharField(verbose_name='이름', max_length=5, null=False)
    last_name = models.CharField(verbose_name='성', max_length=5, null=False)
    phone = models.CharField(verbose_name='휴대폰', max_length=11, null=True, blank=True)

    class Meta:
        verbose_name = '유저'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.email
  • board > models.py
from django.db import models

from user.models import User

class Category(models.Model):
    category_name = models.CharField(verbose_name='카테고리이', max_length=10)

    class Meta:
        verbose_name = '카테고리명'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.category_name

class Post(models.Model):
    user = models.ForeignKey(User, verbose_name='유저', on_delete=models.CASCADE)
    category = models.ForeignKey(Category, verbose_name='카테고리', on_delete=models.CASCADE)
    title = models.CharField(verbose_name='제목', max_length=10)
    content = models.TextField(verbose_name='내용')

    class Meta:
        verbose_name = '게시글'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.title

 

 

 

게시물을 만든 작성자는 User 모델에서 받아오고, 카테고리는 Category 모델에서 받아올 수 있습니다.

이때, 만약 게시글을 작성한 사람이 회원탈퇴나 계정을 삭제 했다고 했을 때, 그 사람이 작성한 게시글도 삭제되게 하려면 on_delete 옵션을 사용하면 됩니다.

 

foreignkey 필드 옵션

  • on_delete = models.CASCADE ; 함께 삭제
  • on_delete = models.PROTECT ; 함께 삭제되지 않도록 error발생
  • on_delete = models.SET_NULL; 삭제될때 필드값을 null로 변경
  • on_delete = models.DEFAULT ; 삭제될때 필드값을 default로 변경
  • on_delete = models.SET(User.objects.get(id=1)) ; 삭제될때 필드 값을 set설정으로 맞춰준다.
  • on_delete = models.DO_NOTHING ; do not anything

 

마지막으로 모델을 새로 만들거나 변경사항이 생기면 마이그레이션을 해줍니다.

python manage.py makemigrations
python manage.py migrate