장고는 모델(Model)을 이용하여 데이터베이스를 처리한다.
보통 데이터베이스에 데이터를 저장하고 조회하기 위해서 SQL 쿼리문을 이용해야하지만
장고의 모델(Model)을 사용하면 이런 SQL 쿼리문의 도움없이 데이터를 쉽게 처리할 수 있다.
SQLite?
SQLite는 주로 개발용이나 소규모 프로젝트에서 사용되는 가벼운 파일 기반의 데이터베이스이다. 개발시에는 SQLite를 사용하여 빠르게 개발하고 실제 운영시스템은 좀 더 규모있는 DB를 사용하는 것이 일반적인 개발 패턴이다.
<장고 앱 migrate>
장고 프로젝트 생성시 기본적으로 설치되는 앱들은 config/settings.py파일에서 확인할 수 있다.
이 중 데이터베이스가 필요한 앱만 migrate가 필요하다.

이제 python manage.py migrate 명령을 실행하여 해당 앱들이 필요로 하는 데이터베이스 테이블들을 생성해 보자.
python manage.py migrate

다음과 같이 admin, auth, contenttypes, sessions 앱들은 장고 프로젝트 생성시 기본적으로 설치되는 앱들이다.
1. 모델 작성하기
이제 파이보가 사용할 데이터 모델을 만들어 보자.
파이보는 질문과 답변을 할 수 있는 파이썬 게시판 서비스이다.
따라서 파이보에는 질문과 답변에 해당하는 데이터 모델이 있어야 한다.
질문(Question) 모델에는 최소한 다음과 같은 속성이 필요하다.

답변(Answer) 모델에는 최소한 다음과 같은 속성이 필요하다.

이를 바탕으로 질문(Question)과 답변(Answer)에 해당되는 모델을 pybo/models.py 파일에 정의해 보자.
from django.db import models
class Question(models.Model):
subject = models.CharField(max_length=200)
content = models.TextField()
create_date = models.DateTimeField()
class Answer(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
content = models.TextField()
create_date = models.DateTimeField()

-Question 모델: 제목(subject), 내용(content) 그리고 작성일시(create_date)를 속성으로 갖도록 작성
CharField: 제목처럼 글자수의 길이가 제한된 텍스트
TextField: 내용(content)처럼 글자수를 제한할 수 없는 텍스트
DateTimeField: 작성일시처럼 날짜와 시간에 관계된 속성
-Answer 모델: Question 모델을 속성으로 갖도록 작성
ForeignKey: 다른 모델과 연결하기 위해 사용
2. 테이블 생성하기
이제 작성한 모델을 이용하여 테이블을 생성해 보자.
테이블 생성을 위해 가장 먼저 해야 할 일은 pybo 앱을 config/settings.py 파일의 INSTALLED_APPS 항목에 추가하는 일이다.

왜냐하면 모델이 신규로 생성되거나 변경되면 makemigrations 명령을 먼저 수행한 후에
migrate 명령을 수행해야 하므로 다음 명령어를 먼저 수행해준다.
python manage.py makemigrations

위 명령을 수행하면 pybo\migrations\0001_initial.py 라는 파이썬 파일이 자동으로 생성된다.

<sqlmigrate>
makemigrations로 데이터베이스 작업 파일을 생성하고 migrate 명령을 실행하기 전에
실제 어떤 쿼리문이 실행되는지 sqlmigrate 명령으로 확인해 볼수 있다.
python manage.py sqlmigrate pybo 0001
-> "pybo"는 앱 이름을 의미하고 "0001"은 생성된 작업파일(예: 0001_initial.py)의 일련번호를 의미한다.

[생성된 0001_initial.py 작업 파일]

<migrate>
이제 migrate 명령을 수행하여 실제 테이블을 생성하자.
python manage.py migrate
오류없이 잘 수행되는 것을 확인할 수 있다.

3. 모델 사용하기
이번에는 모델 사용법을 장고 셸로 익혀보자. 장고 셸은 다음과 같이 실행할 수 있다.
* 장고 셸을 종료하기 위해서는 장고 셸에서 Ctrl+Z 또는 quit()을 입력하면 된다.
python manage.py shell
Question과 Answer 모델은 장고 셸에서 다음처럼 import하여 사용할 수 있다.
먼저 Question 모델을 이용하여 질문 데이터를 만들어 보자.
아래처럼 Question 모델의 객체 q를 생성한 후 save함수를 실행하면 질문 데이터가 1건 생성된다.
( Question 모델의 create_date 속성은 DateTimeField 타입이므로 timezone.now()로 현재일시를 대입)
>>> from pybo.models import Question, Answer
>>> from django.utils import timezone
>>> q = Question(subject='pybo가 무엇인가요?', content='pybo에 대해서 알고 싶습니다.', create_date=timezone.now())
>>> q.save()
>>> q.id
1
데이터가 1건 생성되면 반드시 다음처럼 id 값이 생성된다.
id는 모델 데이터의 유일한 값으로 프라이머리 키(PK:Primary Key)라고도 하며, 데이터를 생성할 때마다 1씩 증가된다.

4. Question 조회
이번에는 저장한 데이터를 조회해 보자.
Question.objects.all()은 모든 Question 데이터를 조회하는 함수
>>> Question.objects.all()
결과값으로는 QuerySet 객체가 리턴되는데 위처럼 Question 객체를 포함하고 있다.
Question object (1), Question object (2) 에서 1과 2는 Question 데이터의 id 값이다.

다음처럼 Question 모델에 __str__ 메서드를 추가하면 id 값 대신 제목을 표시할 수 있다.

이렇게 수정하고 Question.objects.all() 함수를 다시 실행 해 보자.

-그 외의 Question 데이터 조회 방법-

5. Question 수정 및 삭제
1) 수정
이번에는 저장한 Question 데이터를 수정해 보자.
먼저 다음과 같이 id 값이 2인 데이터를 조회하고, subject 속성을 다음과 같이 수정하자.
반드시 다음처럼 save를 수행해 주어야 변경된 데이터가 반영된다는 것을 꼭 기억하자.

2) 삭제
이번에는 id 값이 1인 Question 데이터를 삭제해 보자.
delete를 수행하면 해당 데이터가 삭제되며 아래와 같이 추가정보가 리턴된다.
*(1, {'pybo.Question': 1})= Question 모델이 1개 삭제되었음을 의미한다.
실제로 삭제되었는지 다음처럼 Question.objects.all() 로 확인해 보자.

6. Answer 작성 및 조회
1) Answer 작성
이번에는 답변 데이터를 생성해 보자.
답변 데이터를 만들기 위해서는 질문이 필요하므로 id가 2인 질문을 먼저 조회한 후 question 속성에 대입해 주었다.
Answer 모델도 Question 모델과 같이 유일한 값을 의미하는 id가 자동 생성된다.
>>> q = Question.objects.get(id=2)
>>> q
>>> from django.utils import timezone
>>> a = Answer(question=q, content='네 자동으로 생성됩니다.', create_date=timezone.now())
>>> a.save()
>>> a.id

2) Answer 조회
답변을 조회하는 방법은 질문과 마찬가지로 Answer의 id 값을 사용하면 된다.
>>> a = Answer.objects.get(id=1) #답변 조회방법
>>> a
>>> a.question #Answer # 객체인 a 사용하여 답변에 연결된 질문 조회
>>> q.answer_set.all() # 질문을 이용해 답변 찾는 것
<연결모델명_set(예:answer_set)>
질문 하나에는 여러개의 답변이 가능하므로 q.answer_set이 가능
답변 하나에는 여러개의 질문이 있을 수 없으므로 a.question_set은 불가능
=> 답변 하나에는 질문 하나만 가능하기 때문에 a.question만 가능하다.

'Django' 카테고리의 다른 글
| (6) URL 별칭 (0) | 2024.07.02 |
|---|---|
| (5) Pybo 질문 목록과 상세 기능 구현하기 (0) | 2024.07.02 |
| (4) 장고 관리자 (1) | 2024.07.02 |
| (2) phybo 앱 생성 및 장고 프로그램 만들기 (2) | 2024.07.01 |
| (1) 장고 프로젝트 생성하기 (0) | 2024.06.26 |