0. pybo(파이보) 앱 생성하기
먼저, 명령 프롬프트에서 django-admin의 startapp 명령을 이용하여 앱을 생성해야한다.
앱 이름은 pybo 라고 설정할 것이다.
django-admin startapp pybo
1. pybo(파이보) 앱 등록하기
모델을 이용하여 테이블을 생성할 수 있다. 모델은 앱에 종속되어 있으므로 반드시 Django에 앱을 등록해야 테이블 작업을 진행할 수 있다. 따라서 테이블을 생성하려면 config/setting.py 파일에서 INSTALLED_APPS 항목에 pybo 앱을 추가해야 한다.
# config/setting.py
INSTALLED_APPS = [
'pybo.apps.PyboConfig',
]
# 동시에 언어와 시간도 한국 값으로 바꿔주자
LANGUAGE_CODE = 'ko-kr'
TIME_ZONE = 'Asia/Seoul'
이러면 DJango는 pybo 앱을 인식할 수 있다.
2. 모델 생성
Q&A 게시판을 만드는 프로젝트이기 때문에 필요한 모델은 질문, 답변, 그리고 댓글이다. 여기서 댓글은 질문에 대한 댓글과 답변에 대한 댓글 모두를 포함한다.
이 모델은 pybo 디렉터리에 있는 models.py 파일에 작성할 것이다.
2.1. 질문 모델
Question 클래스로 만들었다. Question 모델에는
작성자(author), 제목(subject), 내용(content), 작성일시(create_date), 수정일시(modify_date), 추천(voter)
을 속성으로 추가했다.
from django.contrib.auth.models import User
from django.db import models
class Question(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='author_question')
subject = models.CharField(max_length=200)
content = models.TextField()
create_date = models.DateTimeField()
modify_date = models.DateTimeField(null=True, blank=True)
voter = models.ManyToManyField(User, related_name='voter_question')
한 줄 한 줄 읽어보자면, 먼저 맨 첫 줄 User 모델은 django.contrib.auth 앱이 제공하는 모델이다. 이 User 모델을 ForeignKey로 적용하여 author 필드에서 선언했다.
(1) author(작성자) 필드
: ForeignKey란 1:N 관계에서 N 쪽을 가르키는 관계 즉, 1명이 작성한 여러 질문, 답변, 댓글들을 가르킨다. 따라서 ForeignKey를 지정하면 N측에서 참조하는 대상의 pk 값을 가져오는 것이다.
: on_delete=models.CASCADE 는 계정이 삭제되면 계정과 연결된 모든 Question 모델 데이터를 삭제하라는 의미이다.
: related_name 은 user 객체에서 author 필드에 접근하기 위한 역참조 문자열을 설정하기 위한 옵션이다. 예를 들어 이 유저가 글을 쓴 유저인지, 그 질문을 추천한 유저인지 구분하기 위해 새로운 이름을 부여하는 것이다.
이렇게 하면 특정 사용자가 작성한 질문을 얻기 위한 some_user.author_question.all() 같은 코드를 사용할 수 있다.
(2) subject(제목) 필드
: 제목은 최대 200자까지만 입력할 수 있도록 CharField에 max_length=200 을 매개변수로 전달하여 설정하였다.
(3) content(내용) 필드
: 제목과 달리 글자 수 제한을 두지 않는 TextField 를 사용한다.
(4) 작성일시(create_date), 수정일시(modify_date) 필드
: 이처럼 날짜와 시간 관련 속성은 DateTimeField를 사용한다.
(5) 추천(voter) 필드
: 글 1개에 여러 명이 추천할 수 있고, 1명이 여러 개의 글에 추천을 누를 수 있다. 이러한 경우에는 ForeignKey와는 달리 다대다 관계를 위한 모델 ManyToManyField를 사용해야한다.
또한 데이터를 조회할 때 제목이 아닌 id값으로만 결과가 나오는 것을 방지하기 위해 Question 클래스 안에 아래 코드도 입력한다.
def __str__(self):
return self.subject
2.2. 답변 모델
Answer 클래스로 만들었다. Answer 모델에는
작성자(author), 해당 답변이 달린 질문(question), 답변 내용(content), 답변 작성일시(create_date), 답변 수정일시(modify_date), 추천(voter)
을 속성으로 추가했다. Question 모델과 크게 다를 것이 없다.
class Answer(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='author_answer')
question = models.ForeignKey(Question, on_delete=models.CASCADE)
content = models.TextField()
create_date = models.DateTimeField()
modify_date = models.DateTimeField(null=True, blank=True)
voter = models.ManyToManyField(User, related_name='voter_answer')
2.3. 댓글 모델
Comment 클래스로 만들었다. Comment 모델에는
작성자(author), 댓글 내용(content), 댓글 작성일시(create_date), 댓글 수정일시(modify_date), 해당 댓글이 달린 질문(question), 해당 댓글이 달린 답변(Answer)
을 속성으로 추가했다.
class Comment(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE)
content = models.TextField()
create_date = models.DateTimeField()
modify_date = models.DateTimeField(null=True, blank=True)
question = models.ForeignKey(Question, null=True, blank=True, on_delete=models.CASCADE)
answer = models.ForeignKey(Answer, null=True, blank=True, on_delete=models.CASCADE)
맨 밑에 question 과 answer 필드가 존재하는데 만약 질문에 댓글을 달면 Comment 모델의 question 필드에 저장되는 것이고, 답변에 댓글을 달면 Comment 모델의 answer 필드에 저장되는 것이다. 이렇게 두 필드는 둘 중 하나만 값이 저장되므로 question 필드와 answer 필드는 모두 'null=True, blank=True' 이어야한다.
이밖에도 Django에서 쓸 수 있는 필드 타입은 많다. 이에 대해서는 아래 링크를 통해 그때그때 필요한 필드를 찾아 적용할 수 있을 것다.
https://docs.djangoproject.com/en/4.0/ref/models/fields/#field-types
Django
The web framework for perfectionists with deadlines.
docs.djangoproject.com
여기서 끝나지 않았다. 보통 데이터베이스에 데이터를 저장하고 조회하기 위해서 SQL 쿼리문을 이용해야 하지만 Django는 이런 SQL 쿼리문의 도움없이 모델(Model)을 이용하여 데이터베이스를 쉽게 처리할 수 있다.
아래는 python manage.py runserver 실행시 나오는 문구이다.
You have 18 unapplied migration(s).
Your project may not work properly until you apply the migrations for app(s):
admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
3. 앱이 필요로 하는 테이블 생성하기
따라서 명령 프롬프트에서 아래와 같이 입력해야 한다.
python manage.py makemigrations
python manage.py migrate
(1) makemigrations 명령
: 모델을 생성하거나 모델에 변화가 있을 경우에 실행해야 하는 명령이다.
위 명령을 수행하면 pybo/migrations/0001_initial.py 라는 파이썬 파일이 자동으로 생성되는데 이는 Django가 테이블 작업을 수행하기 위한 파일들을 생성한다.
(2) migrate 명령
: 테이블을 생성하는 명령이다.
이 명령을 하려면 테이블 작업 명령이 필요한데, 이는 makemigrations 명령 으로 할 수 있기 때문에 순서를 지켜야한다.
(테이블이란 데이터베이스에서 데이터를 저장하기 위한 데이터 집합의 모음이다.)
'🐍 Django 게시판 만들기' 카테고리의 다른 글
Q&A 게시판 만들기 5. views.py 파일 분리해서 작성하기 2 (1) | 2023.10.04 |
---|---|
Q&A 게시판 만들기 5. views.py 파일 분리해서 작성하기 1 (1) | 2023.10.04 |
Q&A 게시판 만들기 4. Admin (0) | 2023.10.04 |
Q&A 게시판 만들기 2. Django 개발 환경 준비하기 (0) | 2023.10.01 |
Q&A 게시판 만들기 1. Django로 질문, 답변 게시판 서비스 만들기 시작하기! (1) | 2023.09.30 |