티스토리 뷰

Backend-dev/python

reading 앱의 모델 정의하기

RunningWater 2018. 10. 18. 17:08

우리가 만드는 파일에 대해서 생각해봅시다.

저번 포스팅 까지는 reading이라는 앱의 이름만 세팅에 추가하고 어떤 앱 인지 무엇이 필요한 지는 다루지 않았습니다. 이제 모델을 정의하기 전에 미리 여러가지를 생각해보고 모델을 정의해보도록 하겠습니다. 리딩 애플리케이션은 책에 나오는 좋은 글귀를 보여주는 앱입니다. 2가지 클래스가 필요합니다. 바로 "책"과 "좋은 글귀"입니다. 책에는 어떤 정보들이 담겨야 할까요? 제가 생각하기엔 책의 이름과 작가, 간단한 책 설명이 있으면 될 것 같군요. 좋은 글귀에는 어떤 정보들이 필요한가요? 이 글귀가 나온 책이 무엇인지 또 그 글귀가 무엇인지만 알면 됩니다.

모델 정의하기

위에서 정의한 것들을 직접적인 형태로 바꿔보겠습니다. 우리는 2개의 테이블이 필요합니다. Book과 Wisesaying라는 이름의 테이블입니다. 또 Book에는 name과 author, introduction이라는 컬럼이 있습니다. Wisesaying이라는 테이블에는 book과 text라는 컬럼이 필요합니다.



모델의 전체 소스는 위와 같습니다. 클래스는 model의 Model을 상속받고 컬럼 역할을 하는 속성들은 models의 필드들을 정의해두면 됩니다. 필드에는 날짜, 파일, 이메일, 문자, 숫자, 이미지 등 다양한 필드가 있습니다. 어떤 값을 받아야 하는 지 생각해보시고, 알맞은 필드를 선택하시면 됩니다.



저희가 만들앱에서는 CharField(문자를 받는 필드)와 TextField(긴 텍스트를 받는 필드)를 사용했습니다. 긴 텍스트는 글자수를 조절할 필요 없지만 CharField에는 max_length를 전달해서 최대 글자 수를 조절했습니다.

관계 파악하기

각 테이블에도 관계가 있습니다. Wisesaying 클래스에 book 속성이 보이시나요? 이 부분이 관계를 설정한 것입니다. 관계에는 1:1, 1:N, N:N 관계가 있습니다. 예시의 경우 가장 많이 사용하는 1:N 관계를 사용했습니다.

한 책에는 여러 개의 좋은 글귀가 나옵니다. 이러한 관계를 1:N 즉 1대 다수의 관계라고 합니다. 간단하게 설명하면 다수가 되는 부분에 하나가 되는 부분을 ForeignKey로 정의해주면 됩니다. 첫 번째 인수로는 "하나"에 해당되는 클래스를 넣어주시면 됩니다. on_delete는 만약에 이렇게 연결된 값이 삭제될 때 남은 값은 어떻게 처리하는 지를 적어준 것입니다. 저는 같이 삭제되도록 값을 지정했습니다. 풀어서 설명하면 "미움받을 용기"라는 책에서 "좋은 글귀"들을 발견해서 정리했습니다. 이때 "미움받을 용기"라는 책을 삭제하면 그 책과 함께 정의했던 "좋은 글귀"들도 같이 삭제가 되는 것입니다.

def __str__(self)를 잊지마세요.

str은 사용자가 보기 쉽게 나타내기 위해 정의하는 것입니다. 만약에 정의하지 않는다면 인스턴스(우리가 정의한 클래스의 값)가<object xxxx> 와 같은 형태로 나타날 것입니다. 그러나 str을 정의했기 때문에 책을 저장했을 땐 그 책의 이름으로, 좋은 글귀를 저장했을 때 그 좋은 글귀로 만들어진 데이터를 볼 수 있습니다.

makemigrations와 migrate

세팅할 때 슈퍼유저를 만들기 전에 migrate라는 명령어를 사용한 것이 기억나시나요? 데이터 베이스의 변경이 있으면 사용하는 명령어들이 makemigrations와 migrate입니다. 간단하게는 makemigrations는 변경된 부분을 파악해서 적용할 부분을 정리한다고 생각하시면 됩니다. 앱 밑에 migrations라는 폴더가 있습니다.


python manage.py makemigrations를 입력하면 여기에 파일이 생깁니다.


실제로 적용하는 부분은 migrate 부분입니다. 역할이 나눠져있다고 생각하시면 됩니다. 

그렇다면 우리는 왜 맨처음에 migrate를 사용했을까요?

settings.py에 설치된 앱을 보시면 django.contrib.auth라는 앱이 설치되어 있습니다. 유저와 그룹에 관한 테이블을 가지고 있는데 미리 설정되어 있는 이 부분을 적용시키기 위해서 해당 명령어를 실행한 것입니다.

python manage.py migrate를 맨 처음에 실행했기 때문에 어드민 페이지에 가서 해당 부분을 볼 수 있었습니다.

django auth 적용auth를 migrate하면 보여지는 부분


우리가 어드민 페이지에 가서 맨 처음에 사진과 같은 부분을 볼 수 있는 것도 세팅 부분에서 migrate를 했기 때문 입니다. 우리의 모델을 수정한 뒤에는 반드시 makemigrations와 migrate 순서로 실행해주시면 됩니다. 우리가 모델을 정의했으니 잊지말고 입력해주세요.



모델을 정의하면서 가장 많이 들어가는 곳이 어디일까요? 바로 admin.py 입니다. 정의한 모델을 어드민 페이지에서 나타내야하기 때문입니다. 다음 포스팅에서는 어드민 파일을 다루도록 하겠습니다.


댓글