[ 모델 사용법 ]
전에 모델을 만들어 보았으니 이제 사용법을 장고 셸로 배워보자. 일단 python manage.py shell 명령어로 장고 셸을 열자.
명령어를 입력하면 셸이 열린다. 반드시 장고 셸로 실행해야하는 이유는 장고 셸에는 장고에 필요한 환경들이 자동으로 설정되어 실행되기 때문이다.
장고 셸에 Question, Answer 모델을 import 해서 사용한다. 장교 셸에 from pybo.models import Question, Answer 명령어를 수행하자. 그 후 일단 Question 모델을 이용해 질문 데이터를 만들어보자.
question,answer 모델을 import 한후, create_date 에 적어넣을 timezone 도 import 한다. 객체 Question모델의 객체q 를 생성한후 속성들을 채워넣는다.create_date 의 속성은 DateTimeField 타입이므로 timezone.now()로 현재시간을 대입하였다. q.save()로 저장을 하면 데이터 하나가 생성된다. q.id로 확인을해보면 id 값이 생긴걸 확인할 수 있다. id 는 모델 데이터의 유일한 값으로 프라이머리 키 (PK) 라고도 한다. 이 값은 데이터를 생성할 때마다 1씩 증가된다.
질문을 하나 더 만들어보자.
사진을 보면 q.save 를 했는데 경고문이 뜨면서 저장이 앉되서 해맨 흔적이 있다. q.save 가 아니라 q.save() 를 해야한다. 나처럼 실수하는 사람이 없기를 바라는 마음으로 올려보았다. 질문을 하나 더 작성하니 q.id 가 2가 된것을 확인할 수 있다.
이제 만든 데이터들을 조회해 보자. Question.objects.all() 명령어를 쳐보자.
오타가 발생해서 실행이 제대로 되지않게 명령어를 제대로 입력해야한다. Question모델의 데이터는 Question.objects를 통해서 조회할수 있고 뒤에붙은 .all()은 모든 데이터를 조회하는 함수이다. 명령을 수행하면 QuerySet의 객체가 리턴된다. 이것들은 Question 객체를 포함한다. 객체 안에 1 과 2 는 데이터의 id 값이다. 뒤에 id 값이 아닌 제목을 표시하고싶다면 Question 모델에 __str__ 메서드를. 추가하면 id 값 대신 제목을 표시할 수 있다.
pybo/models.py 에
def __str__(self):
return self.subject
를 추가하면 된다. Question 모델을 변경하려는 것이였으므로 Question 모델 안에다가 작성해야만한다. 그리고 모델이 변경되었으므로 장고 셸을 재시작해야 변경된 결과를 확인할 수 있다.
장고 셸을 재시작후 다시 모델들을 import 한후 Question.obbjects.all() 을 하면 이전과 달리 제목이 표시 된다. 모델의 메서드가 추가된 경우에는 makemigrations, migrate 를 수행할 필요가 없다. makemigrations, migrate 는 모델의 속성이 변경되었을 경우에 사용하는것이다.
filter 함수를 사용해 id 값이 1 인 데이터를 조회해보면
id 값은 유일한 값이기 때문에 get 함수를 이용해도 비슷한 결과를 얻을수 있다. 하지만 filter 함수는 filter함수에 맞는 여러개가 리턴되기때문에 QuerySet 이 리턴된다. get 함수는 Question 모델 객체가 리턴된다. get 함수는 조건에 맞는 데이터가 1개일 경우일때 사용한다. 데이터가 여러개일때 get 함수를 사용하면 오류가 난다. 보통 get 함수는 id 와 같은 유일한 값으로 조회할 경우에만 사용한다.
filter 함수를 사용해 subject에 'pybo' 라는 문자열이 포함된 데이터만 조회할수도 있다.
filter 함수 사용법은 장고 공식 문서를 참조해서 더 알아보자. 장고 공식 문서는 장고 개발시 필수로 참조해야하는 문서이다.
https://docs.djangoproject.com/en/4.0/topics/db/queries/
이제 Question 데이터를 수정해보자. 일단 id값이 1 인 데이터를 조회해보자.
id 값이 1인 데이터를 q 에 초기화후 subject 속성을 수정후 저장한후 q내용을 확인해 보면 변경된 것을 알수있다.
이번엔 id값이 1 인 Question 데이터를 삭제해보자. 먼저 id값이 1 인 데이터를 조회하자.
q 에 id 값이 1인 데이터를 초기화후 q.delete() 하면 (1, {'pybo.Question': 1}) 이 출력된다. 이는 Question 모델이 1개 삭제 되었다는것을 의미한다. 그후 질문 모델 전체를 조회해보면 질문이 삭제되고 하나만 남은것을 알 수 있다.
이제 답변을 해보자. Question 데이터를 작성하고 조회하고 수정하고 삭제한것과 비슷하다. 먼저 id 값이 1 인 질문 데이터는 삭제했으므로 id 값이 2인 데이터를 조회해서 데이터를 작성해보자.
q에 id값이 2인 Question 데이터를 넣고, a에 Answer 데이터를 작성한후 저장하자. a.id 를 보면 id 가 1이 된것을 볼수있다.
Question 때와 같이 id 값을 이용해 데이터를 찾을 수 있다.
Answer 모델의 속성을 이용해 다양한 정보를 조회할 수 있다.
질문을 이용하여 답변을 찾는것도 가능하다.
q.answer_set.all() 명령을 하면 질문에 연결된 답변 모두를 가져올 수 있다. Question 모델에는 answer_set이라는 속성은 없지만 Answer 모델에는 Question 모델이 ForeignKey로 연결되어 있기 때문에 q.answer_set 과 같은 접근이 가능하다. 하지만 반대로는 불가능하다. 상식적으로 질문하나에는 여러개의 답변이 가능하므로 q.answer_set 이 가능하지만 답변하나에는 여러개 질문이 있을수 없으므로 a.question_set 은 불가능하다. 답변하나에는 질문 하나만 가능하기 때문에 a.question 만 가능하다.
'Django > 따라하는 장고' 카테고리의 다른 글
8. 템플릿 (1) | 2022.10.19 |
---|---|
7. 장고 관리자 (1) | 2022.10.17 |
5. 장고 모델 작성법 (0) | 2022.10.13 |
4. 파이참의 기본 요소 (0) | 2022.10.12 |
3. 파이참 사용하기 (0) | 2022.10.11 |