본문 바로가기
IT

[프로그래밍] Chap 2. 장고 기본 요소 학습#3 (DB:데이터생성/수정)

by 밤고래 2021. 4. 30.
반응형

안녕하세요. 밤고래에요 :)

이번 페이지에서는 Django의 ORM을 이용해 데이터베이스 베이스 제어하는 법#2을 다루겠습니다.

앞에서 만든 테이블에 데이터를 만들고, 수정하는 실습을 진행합니다.

 

 

[실습] 데이터 만들고 저장하고 조회하기(p60)

장고 셸을 사용하면 모델 사용법을 쉽게 익힐 수 있다.

 

Step 1. 장고 셸 실행하기

Step 2. Question, Answer 모델 임포트 하기

앞에서 생성한 Qustion과 Answer 모델을 장고 셸에 임포트하자

 

Step 3. Questions 모델로 Question 모델 데이터 만들기

Question 모델을 이용하여 데이터를 하나만 만들어보자

Question 모델의 subject 속성에 제목을, content 속성에 문자열로 질문 내용을,

create_date 속성은 DateTimeField 이므로 timezone.now() 로 현재 일시를 입력한다.

 

이 과정을 통해 Question 모델의 객체 q 가 생성된다.

 

Step 4. Question 모델 데이터의 id값 확인하기

Question 모델 데이터가 잘 생성되었는지 확인해보자.

장고는 데이터 생성 시 데이터에 id 값을 자동으로 넣어준다.

 

 

id 는 데이터의 유일한 값, 프라이머리 키(PK)라고도 한다.

id 값은 데이터를 생성할 떄마다 1씩 증가한 값으로 자동으로 입력된다.

 

Step 5. Question 모델로 Question 모델 데이터 1개 더 만들기

 

 

Step 6. Question 모델 데이터 모두 조회하기

모든 Question 모델 데이터를 조회하기 위해 'Question.objects.all()'을 입력한다.

 

 

장고에서 저장된 모델 데이터는 '[모델명].objects' 를 사용하여 조회할 수 있다.

 

Step 7. Question 모델 데이터 조회 결과에 속성값 보여 주기

그런데 6단계 결과는 데이터 유형을 출력한 겂이므로 사람이 보기 불편하다.

이 때 Question 모델에 __str__ 메서드를 추가하면 된다.

 

 

호출 시, return 값으로 각 객체의 subject(제목) 을 출력하도록 정의했다.

 

 

Step 8. Question 모델 데이터 다시 조회해보기

모델이 수정되었으므로 장고 셸을 다시 시작하자.

장고 셸에서 quit() 명령을 실행해 종료한 후 다시 시작하자.

 

그러면 Question 모델 데이터에 id가 아니라

위에 __str__ 함수에서 정의한 것 처럼 subject(제목)이 표시된다.

 

추가로 모델의 속성이 추가되거나 변경된 경우는

makemigrations, magate 명령을 실행해야 하지만, 

금번에는 메서드(__str__)가 추가된 경우이므로 이 과정은 하지 않아도 된다.

즉, 모델 내 메서드 추가/변경은 마이그레이션 관련 명령을 수행하지 않아도된다.

 

Step 9. 조건으로 Question 모델 데이터 조회하기

조건을 주어 Question 모델 데이터를 조회하고 싶다면 filter 함수를 사용하면 된다.

 

filter 함수는 반환값이 QuerySet 으로 리스트형태로 보여준다.

 

Step 10. Question 모델 데이터 하나만 조회하기

get 함수를 사용하면 리스트가 아닌 데이터 하나만 조회할 수 있다.

 

반환 값을 보면 QuerySet 이 아니라 Question 이다.

filter 함수는 여러 건의 데이터를 반환하지만, get 함수는 단 한건의 데이터를 반환한다. 

두 함수의 차이점을 꼭 알아두어야 한다!

 

Step 11. get으로 조건에 맞지 않는 데이터 조회하기

아직 생성하지 않은 id가 3인 데이터를 조회해보자

 

Step 12. filter 로 조건에 맞지 않는 데이터 조회하기

그럼 filter 함수는 어떨까?

 

filter 함수는 조건에 맞는 데이터가 없으면 오류가 아닌 그저 빈 QuerySet을 반환한다.

get 함수는 반드시 1건의 데이터를 반환해야 한다는 특징이 있으므로 오류가 발생할 것이다.

 

Step 13. 제목의 일부를 이용하여 데이터 조회하기

subject에 "장고"라는 문자열이 포함된 데이터를 조회하려면

조건에 subject__contans 를 이용하면 된다.

 

 

이 밖에도 filter 함수의 사용방법은 무궁무진하다!!

 

 

 

[실습] 데이터 수정하기(p65)

이번에는 지금까지 저장했던 Question 모델 데이터를 수정하자

 

Step 1. Question 모델 데이터 수정하기

Question모델 데이터를 수정하려면, 우선 수정할 데이터를 조회해야 한다.

 

q라는 변수에 id가 2인 Question 모델의 데이터를 입력했다.

 

Step 2. subject 속성 수정하기

subject 속성을 수정하자

 

Step 3. 수정한 Question 모델 데이터 데이터베이스에 저장하기

반드시 다음처럼 save 함수를 실행해야 변경된 Question 모델 데이터가 데이터베이스에 반영된다.

 

 

[실습] 데이터 삭제하기(p66)

이번에는 Question 모델 데이터를 데이터베이스에서 삭제해보자

 

Step 1. Question 모델 데이터 삭제하기

 

delete 함수를 수행하면 save 함수를 별도로 입력할 필요없이

해당 데이터가 데이터베이스에서 즉시 삭제되며, 삭제된 데이터의 추가 정보가 반횐된다.

1은 삭제된 Question 모델의 id, {'pybo.Question' : 1]은 삭제된 모델 데이터의 개수를 의미한다.

 

Step 2. 삭제 확인하기

 

 

 

[실습] 연결된 데이터 알아보기

앞에서 Answer 모델을 만들 때 ForeignKey 로 Question 모델과 연결한 내용이있다.

Answer 모델은 Question 모델과 연결되어있으므로 

데이터를 만들 때 Question 모델 데이터가 필요하다.

 

Step 1. Answer 모델 데이터 만들기

id가 2인 Question 모델 데이터를 얻은 다음, 이를 이용하여 Answer 모델 데이터를 만들어보자

 

 

SQLite 프로그램에서도 GUI 로 Answer 테이블의 데이터를 확인할 수 있다.

 

 

Step 2. id 확인하기

Step 3. Answer 모델 데이터 조회하기

get 함수로 조회해보자.

Step 4. 연결된 데이터로 조회하기 : 답변에 있는 질문 조회하기

Answer 모델 데이터는 Question 모델 데이터가 연결되어 있으므로

Answer 모델 데이터에 연결된 QUestion 모델 데이터를 조회할 수 있다.

 

여기서 Answer 모델의 속성을 다시한번 보자.

 

Answer 모델은 question 속성을 가지고 있으며,

question 속성은 Question 모델의 리턴 값을 가지고 있다.

 

Step 5. 연결된 데이터로 조회하기: 질문을 통해 답변 찾기

다음처럼 answer_set을 사용하면된다. 

 

Question 모델과 Answer 모델처럼 서로 연결되어 있으면

'연결모델명_set'과 같은 방법으로 연결된 데이터를 조회할 수 있다.

 

그런데 여기서 저 연결모델명에 Question을 써야하는지 Answer를 써야하는지 헷갈린다.

Answer에 해당하는 Quetion는 하나지만, Question에 해당하는 Answer는 여러 개이다.

하위 개념에 해당하는 모델명이 바로 '연결모델명'이다.

이 기능은 장고에서 굉장히 유용한 기능이다!

반응형

댓글