드디어 모델을 사용하기 위한 준비가 끝났다. 이제 django 쉘을 실행하여 직접 모델의 인스턴스를 생성하고 데이터베이스에 저장, 조회하는 작업을 해보자.
1. django shell
아래 명령어를 실행하여 django 쉘을 실행할 수 있다. 장고 쉘은 python 인터프리터와 유사한 환경이며 실제로 파이썬 문법도 사용가능하다.
python manage.py shell
2. Question 생성
pybo\models.py 에 정의된 Question 과 Answer 모델(클래스), timezone 모듈을 import 한 뒤 Question 모델의 인스턴스를 하나 만들어본다. timezone 은 생성시간을 넣어주기 위해 사용하였다. q.save()를 실행하면 데이터베이스의 Question 모델 인스턴스 리스트에 추가된다. 이 때, q.id 를 출력해보면 어떤 숫자가 나오는데, 이 id는 인스턴스가 생성될 때 마다 자동으로 생성/부여되는 고유키이다. 필자의 경우 기존에 3개의 Question 인스턴스가 저장된 상태이기에 새로 생성한 질문의 id는 4가 되었다.
3. Question 조회
이제 생성한 Question 모델을 조회해 볼 차례이다. Question.objects.all() 을 실행하면 위와 같이 저장된 Question 모델의 인스턴스들을 쿼리셋 객체의 형태로 반환한다. 각 오브젝트 옆에 (숫자)가 붙어있는데, 이는 각 인스턴스의 id번호를 의미한다. 여기에 표시되는 부분은 모델을 정의한 pybo\models.py 를 수정하여 바꿀 수도 있다.
모델을 정의한 클래스에 __str__ 메소드를 구현해줄 경우, 그 클래스의 인스턴스를 문자열화 할 때의 결과를 컨트롤 할수 있다. 위와같이 자신의 제목을 반환하도록 메소드를 구현해보자.
그 후에 다시 Question의 오브젝트들을 조회해보면 id대신 그 질문의 제목이 표시되는 것을 확인할 수 있다. 모델에 새로운 메소드를 추가할 경우에는 makemigrations와 migrate를 수행할 필요 없이 django shell만을 재실행하면 적용이 된다. migrate가 필요한 경우는 모델의 속성이 변경된 경우 뿐이다.
이제 Question 중 원하는 것만을 조회하는 방법을 알아보자.
조건에 맞는 오브젝트를 조회하기 위한 방법으로 filter를 사용하는 방법과 get을 사용하는 방법 두 가지가 있다. 위에서 보다시피 filter를 사용한 경우엔 쿼리셋이, get을 사용한 경우엔 단순히 Question 오브젝트 하나가 반환되었다. 이는 filter는 조건에 맞는 모든 오브젝트들을 반환하고, get은 조건에 맞는 단 하나의 오브젝트만을 반환하기 때문이다. 그렇기 때문에 get으로 조회하려면 조건이 될 속성은 오브젝트마다 유일한 값이어야한다.
필터의 경우 사용법만 알면 굉장히 다양한 조건으로 데이터를 추려낼 수 있다. 필터의 자세한 사용법은 장고 공식문서(https://docs.djangoproject.com/en/3.0/topics/db/queries/)를 참고하는 것이 좋다.
4. Question 수정/삭제
다음은 이미 저장된 데이터의 수정이다. 위와 같이 수정하려는 데이터를 가져온 뒤 수정하려는 속성 값을 변경, save()를 다시한번 실행해주면 수정된 데이터가 반영된다. save()까지 실행해주지 않으면 변경사항은 적용되지 않는다.
삭제는 더욱 간단하다. 수정과 마찬가지로 Question에서 삭제할 데이터를 가져온 뒤 delete()를 실행해주면 데이터는 삭제된다.
5. Answer의 작성/조회
Answer 모델의 데이터를 작성하는 것도 Question과 같은 방식으로 진행한다. 다만 Answer의 경우 생성을 위해 Question이 필요하기 때문에 먼저 매칭될 Question 데이터를 하나 가져온 뒤 작성한다.
조회 또한 같은 방식으로 하면 된다. Answer 데이터에는 question 속성이 연결되어있기 때문에 어느 질문에 대한 답인지도 확인 가능하다. 그렇다면 Question 데이터를 가지고있을 때 그에 대한 Answer 데이터들을 조회하는 것도 가능할까?
Answer에 Foreign Key 로 Question 모델이 연결되어있기 때문에 Question 데이터에서 answer_set을 사용하여 연결된 Answer 데이터들에 접근할 수 있다. 이는 django에서 기본적으로 지원하는 기능이기에 사용자가 별도로 신경써야할 부분은 없다. Foreign Key로 연결된 데이터에서 연결모델명_set 은 자주 사용되는 기능이니 반드시 기억해둘 필요가 있다.
'개인 프로젝트 > Django-mysite' 카테고리의 다른 글
#7 템플릿(Template) (0) | 2021.08.16 |
---|---|
#6 django admin (0) | 2021.08.16 |
#4 django 의 기본 요소 - Model 작성과 Migration (0) | 2021.08.11 |
#3 django 의 기본 요소 - URL, View (0) | 2021.08.11 |
#2 개발 환경 갖추기(2) (0) | 2021.08.10 |