본문 바로가기

dev/django

[django] models - modeling, migrate

[django] url 분리

[django] Hello world


우리는 이제 프로젝트와 앱을 생성하고 해당하는 뷰를 작성한 후 url을 해당 뷰에 연결시킬 수 있다

 

이제 모델링을 할 차례고

우리는 Q&A 게시판을 만들어볼 예정이다.

질문하는 글이 올라오면 그에 대한 답변을 올릴 수 있는 시스템을 구현해야 하는데

그럴려면 다음의 것들이 필요하다

 

질문글의 제목, 내용, 작성 일시

답변글의 답변한 질문글 제목, 내용, 작성 일시

 

그럼 일단 완성본을 보고 설명을 이어나가도록 하자

from django.db import models  # django.db 에서 models를 불러옴
"""
class 클래스명(인수):
    속성1 = 인수1.필드타입(필드옵션)
    속성2 =
    속성3 =
    속성4 = 
    class 자식클래스명:
    	db_table='테이블 이름'
"""
class Question(models.Model): # 클래스명은 항상 단수,카멜케이스,첫 글자는 대문자
    subject     = models.CharField(max_length=200)
    user_id     = models.CharField(max_length=200)
    content     = models.TextField()
    created_at  = models.DateTimeField(auto_now_add=True)
    updated_at  = models.DateTimeField(auto_now=True)
    
    class Meta:
        db_table='questions'  # 테이블 이름은 항상 복수, 스네이크케이스, 모두 소문자


class Answer(models.Model):
    question    = models.ForeignKey(Question, on_delete=models.CASCADE)
    user_id     = models.CharField(max_length=200)
    content     = models.TextField()
    created_at  = models.DateTimeField(auto_now_add=True)
    updated_at  = models.DateTimeField(auto_now=True)

    class Meta:
        db_table='answers'

2개의 클래스를 만들었고 이름에서 알 수 있듯 각각 질문과 답변에 관한 내용이다

앞서 우리가 정리했던 요소들(질문 글의 제목, 작성자, 내용, 작성일시)을 class의 속성(Attribute)으로 가지고 있다

 

question    = models.ForeignKey(Question, on_delete=models.CASCADE)
  
"""
ForeignKey를 이용하여 Question 모델을 Answer 모델의 속성으로 가져왔다
on_delete 속성은 현재 필드의 값으로 가져온 모델이 삭제될 경우의 행동을 물어보는 필드 옵션으로
on_delete=models.CASCADE의 의미는
현재 필드에 ForignKey로 연결된 필드의 값(Question의 PK)이 삭제될 경우 현재 필드도 삭제하라는 의미로

현재 이 모델링의 특성상 질문이 삭제되면 답변도 함께 삭제된다
"""
 created_at  = models.DateTimeField(auto_now_add=True)
 updated_at  = models.DateTimeField(auto_now=True)
 
 """
 각각 생성일자와 수정일자를 DATABASE에 기록하기 위해 만들었고
 auto_now_add=True 는 테이블에 값이 새로 작성됐을 때의 날짜,시간만 기록하고
 auto_now=True 는 값이 수정됐을 때의 날짜, 시간만을 기록한다
 """

연습을 위해서 만드는 것이기 때문에 처음에는 CharField를 사용하는 클래스로 1개만 만들어서 해본 뒤에
필드를 추가하거나 다른 클래스를 추가로 정의하는 방식을 추천한다


자 이제 모델링을 끝냈으면 migrate 명령을 통해 테이블을 생성해보자

본인은 mysql 을 기준으로 설명하겠다

 

우선 settings.py 안에 installed_apps 부분에 우리가 startapp 으로 만든 앱의 이름을 추가해준다

터미널에 다음과 같이 입력하자

python manage.py makemigrations 앱 이름

주의할 점: 이 명령어를 실행시키는 곳은 반드시 manage.py가 있는 디렉토리여야 한다

그럼 다음과 같은 결과가 나온다

우리가 추가한 Question 과 Answer 의 모델링이 잘 생성된 것을 알 수 있다

그리고 파일 디렉토리를 잘 살펴보면 결과의 붉은 글씨에서 언급된 파일이 하나 생성된 것을 확인할 수 있다

아직 테이블이 생성된 것은 아니다

위 사진에 표시된 파일은 장고가 테이블 작업을 수행하기 위한 작업 파일이기 때문이다

 

그리고 다음의 명령어를 입력해주면 결과화면과 함께 migrate가 진행되고 테이블이 생성된다

python manage.py migrate

 

만약 model의 속성이 변경됐을 경우에는 makemigration 과 migrate 명령을 다시 한번 수행해주어야 테이블에 반영된다

다만, model에 메서드가 추가되는 경우에는 수행할 필요가 없다

'dev > django' 카테고리의 다른 글

[django] Model - Field options  (0) 2022.03.07
[django] Model - 숫자관련 Field  (0) 2022.02.24
[django] url 분리  (0) 2022.02.14
[django] Hello world  (0) 2022.02.13
[django] 프로젝트 생성, 개발 서버 구동하고 접속하기  (0) 2022.02.10