장고는 모델(Model) 을 이용하여 데이터베이스를 처리한다. 보통 데이터베이스에 데이터를 저장하고 조회하기 위해서 SQL 쿼리문을 이용해야 하지만 장고의 모델(Model) 을 사용하면 이런 SQL 쿼리문의 도움없이 쉽게 처리할 수 있다.
#장고 앱 migrate
# python manage.py runserver 시 다음과 같은 문구를 확인할 수 있다.
You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
# 위에서 말한대로 python manage.py migrate 명령을 수행해보자.
python manage.py migrate
# 위 명령어를 실행하면 migrate 가 수행된다.
# 이로 인해 admin, auth, contenttypes,sessions 앱들이 사용하는 테이블들이 생성된다.
# 어떤 테이블들이 생성되는 지 알 필요는 없다.
#모델 작성하기
1) 모델 속성
Question 모델
Answer 모델
#models.py
from django.db import models
# Create your models here.
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()
- Answer 모델은 질문에 대한 답변에 해당되므로 Question 모델을 속성으로 가져가야한다.
- 기존 모델을 속성으로 연결하려면 ForeignKey 를 사용해야한다.
- ForeignKey 는 다른 모델과 연결하기 위해 사용한다.
- on_delete = models.CASCADE 의 의미는 이 답변과 연결된 질문(Question) 이 삭제될 경우 답변(Answer) 도 함께 삭제된다는 의미이다. 즉, CASCADE 옵션은 질문을 삭제하면 그에 달린 답변들도 모두 함께 삭제한다.
#테이블 생성하기
테이블을 생성하기 위해 가장 먼저 해야할 일은 pybo 앱을 config/settings.py 파일의 INSTALLED_APPS 항목에 추가하는 것이다.
(... 생략 ...)
INSTALLED_APPS = [
'pybo.apps.PyboConfig',
'django.contrib.admin',
'django.contrib.auth',
(... 생략 ...)
]
(... 생략 ...)
#pybo.apps.PyboConfig 클래스는 pybo/apps.py 파일에 있는 클래스이다.
#pybo/apps.py
from django.apps import AppConfig
class PyboConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'pybo'
#makemigrations
테이블을 생성하기 위해 migrate 명령을 수행해보자.
모델이 신규로 생성되거나 변경되면 mkaemigrations 명령을 먼저 수행한 후에 migrate 명령을 수행해야한다.
#python manage.py makemigrations
#makemigrations 명령은 모델을 생성하거나 모델에 변화가 있을 경우 실행해야 하는 명령이다.
#sqlmigrate
makemigrations 로 데이터베이스 작업 파일을 생성하고 migrate 명령을 실행하기 전에 실제 어떤 쿼리문이 실행되는 지 sqlmigrate 명령으로 확인해 볼 수 있다.
sqlmigrate 명령은 단지 실행되는 쿼리만 조회할 뿐이다. 실제 쿼리가 수행되지는 않는다.
python [manage.py](http://manage.py/) sqlmigrate pybo 0001
#“pybo” 는 앱 이름을 의미하고, “0001” 은 생성된 작업파일(0001_inital.py) 의 일련번호를 의미한다.
#migrate
migrate 명령을 수행하여 실제 테이블을 생성.
python manage.py migrate
#모델 사용하기
장고 셀을 이용하여 모델을 사용해보자.
#python manage.py shell
>>> from pybo.models import Question, Answer
>>> from django.utils import timezone
>>> q = Question(subject='pybo가 무엇인가요?', content='pybo에 대해서 알고 싶습니다.', create_date=timezone.now())
>>> q.save()
>>>1
#Question 조회
>>>Question.objects 를 통해서 조회할 수 있다.
Question.objects.all() 은 모든 Question 데이터를 조회하는 함수이다.
class Question(models.Model):
subject = models.CharField(max_length=200)
content = models.TextField()
create_date = models.DateTimeField()
def __str__(self):
return self.subject
#class에 __str__ 메서드를 추가하면 id 값 대신 제목을 표시할 수 있다.
<QuerySet [<Question: pybo가 무엇인가요?>, <Question: 장고 모델질문입니다.>, <Question: pybo가 무엇인가요?>]>
#filter 사용
#조건에 해당하는 데이터는 모두 리턴해줌
Question.objects.filter(id=1)
#Question.objects.get(id=1)
#조건에 맞는 데이터 한 건만 리턴해줌
#문자열이 포함된 데이터만 조회하는 방법
>>> Question.objects.filter(subject__contains='장고')
#질문을 이용하여 답변을 찾는 방법
>>>q.answer_set.all()
q.answer_set 을 사용하면 질문에 연결된 답변을 가져올 수 있다. Question 모델에는 answer_set 이라는 속성이 없지만 Answer 모델에 Question 모델이 ForignKey 로 연결되어 있기 때문에 q.answer_set 과 같은 역방향 접근이 가능하다.
단, answer_set 의 경우 여러 개의 답변이 있는 경우에만 사용할 수 있으며, 답변이 하나도 없는 경우는 a.question 을 사용해야한다.
📖 참고 자료
#SQLite
주로 개발용이나 소규모 프로젝트에서 사용되는 가벼운 파일 기반의 데이터베이스이다.
#ORM(Object Relational Mapping)
데이터베이스의 테이블을 모델화하여 사용하기 때문에 위에서 열거한 SQL 방식의 단점이 모두 없어진다. ORM 을 사용하면 개발자별로 독특한 쿼리문이 만들어질 수 없고, 또 쿼리를 잘못 작성할 가능성도 줄어든다. 그리고 데이터베이스 종류가 볍ㄴ경되더라도 쿼리문이 아닌 모델을 사용하기 때문에 프로그램을 수정할 필요가 없다.
**전통방식
#장고 공식문서
https://docs.djangoproject.com/en/4.0/ref/models/fields/#field-types
[Django] URL 별칭 (0) | 2022.09.16 |
---|---|
[Django] 질문 목록 및 상세 페이지 만들기 (0) | 2022.09.16 |
[Django] 장고 관리자 (admin) (1) | 2022.09.15 |
[Django] 앱(APP) 생성하기 (복습) (0) | 2022.09.10 |
[Django] 일반적인 웹 요청 처리 프로세스 (0) | 2022.09.06 |