# ORM(Object Relational Mapping)
ORM이란 프로그래밍 언어의 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것을 말합니다
장고는 ORM을 사용하여 SQL쿼리문 없이 데이터 작업을 쉽게 할 수 있다는 장점이 있습니다. 보통 개발할 때, 데이터베이스에 데이터를 저장하고 조회하기 위해서는 SQL 쿼리문을 이용하는데, 개발자마다 다양한 쿼리문이 만들어질 수 있고, 쿼리를 잘못 작성했을 때 시스템 성능 저하, 데이터베이스 종류가 달라지면 그에 맞게 쿼리문을 수정해야함과 같은 단점이 있습니다. 하지만, ORM은 이러한 단점을 없애줍니다
# Django 데이터베이스 세팅
장고 실행 후 자동생성된 config/settings.py파일에는 사용하는 데이터베이스와 설치된 앱에 대한 정보가 정의되어 있습니다.

데이터베이스 엔진은 django.db.backends.sqlite3이고, 데이터베이스 파일은 BASE_DIR 디렉터리 밑에 db.sqlite3 파일에 저장한다고 정의되어 있습니다.(BASE_DIR은 프로젝트 디렉터리를 의미)

또, 생성한 앱에 대해서 데이터 처리를 하기 위해서는 INSTALLED_APPS에 정의해주어야 합니다. INSTALLED_APPS에 추가해줄 클래스는 생성한 앱의 apps.py 파일에 있습니다. ( 예시 - pybo/apps.py의 PyboConfig 클래스 : 'pybo.apps.PyboConfig' )
# Model 작성 방법
1. 생성한 앱의 Model.py에서 데이터 모델을 작성
2. 모델을 신규 생성 혹은 수정했다면 python manage.py makemigrations 명령을 수행한다 migrate 해준다 (장고가 테이블 작업을 수행하기 위한 작업 파일을 생성하는 명령어로 '등록'의 개념으로 생각하면 쉬움 - 0001_initial.py 파일이 자동 생성됨)
3. python manage.py migrate 명령을 수행(실제 테이블 생성)
migrate란 데이터를 선택, 준비, 추출 및 변환하여 한 컴퓨터 저장 시스템에서 다른 컴퓨터 저장 시스템으로 영구적으로 전송하는 프로세스입니다. 쉽게 말하면 우리가 코드로 작성한 클래스를 데이터베이스로 옮겨주는 것을 의미합니다.
makemigrations 후, migrate하기 전에 실제 어떤 쿼리문이 실행될지 확인해보면 좋은데, pybo manage.py sqlmigrate <APP> <생성된 작업파일의 일련번호> 명령으로 확인해볼 수 있습니다. (예시 - pybo manage.py sqlmigrate pybo 0001)
[ Model.py ]
Model.py작성은 from django.db import models를 해서 시작합니다. 각 모델은 클래스로 정의하는데 models.Model을 상속받으며, 클래스 안에 속성 = models.<FieldType>로 정의해줍니다. 아래 예시 코드로 이해하시면 되겠습니다,
from django.db import models
class Question(models.Model):
subject = models.CharField(max_length=200) #제목 (글자수 제한: 최대200자)
content = models.TextField() #내용
create_date = models.DataTimeField() #작성일시
class Answer(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE) #Qusetion모델을 속성으로 가져야함
content = models.TextField()
create_date = models.DataTimeField()
FieldType은 아래 장고 공식 문서를 통해 확인 다양한 종류에 대해서 공부해보세요! (추후 정리해서 포스팅하도록 하겠습니다)
Model field reference | Django documentation | Django
Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate
docs.djangoproject.com
migrate하고나서, DB Browser for SQLite 프로그램을 이용하여 테이블을 확인할 수있습니다
# Model 사용법
python manage.py shell을 실행해 모델을 사용할 수 있습니다.(장고 shell 종료 : ctril+z / quit())
위에서 만든 Question모델을 예시로 보면,
python manage.py shell
>>> from pybo.models import Question, Answer
>>> from django.utils import timezone #현재일시를 사용하기 위한 모듈
>>> q = Question(subject='질문입니다', content='내용입니다', create_date=timezone.now())
>>> q.save()
# 질문 데이터 1건 생성됨
Question 모델의 객체 q생성후 save()하면 질문데이터가 1건 생성됩니다.(q객체는 클래스안에 속성에 대한 입력값을 작성) 이때 q.id를 입력하면 1이 나오는데,여기서 id는 모델 데이터의 유일한 값으로 primary key라고도 하며, 데이터를 생성할 때마다 자동으로 1씩 증가합니다. 같은 방법으로 또 질문데이터를 만들면 id값은 2가 됩니다.
[ 데이터 조회 ]
데이터 조회는 마찬가지로 장고 shell에서 실행합니다.
<Model>.object.alll() :모델의 모든 데이터를 조회하는 함수
<Model>.object.filter() : 필터 조건에 해당하는 모든 데이터를 조회하는 함수
<Model>.object.get() : 조회하고자하는 데이터 하나를 반환하는 함수
Question.objects.all()
<QuerySet [<Question: 질문입니다 >, <Question: 장고 모델 질문입니다>]>
>>> Question.objects.filter(id=1)
<QuerySet [<Question: 질문입니다>]> #filter은 다건의 데이터이므로 QuerySet 반환
>>> Question.objects.filter(subject__contains='질문')
<QuerySet [<Question: 질문입니다>, <Question: 장고 모델 질문입니다>]> #'질문'이라는 문자열이 포함된 데이터들 반환
>>> Question.objects.get(id=1)
<Question: 질문입니다> #get은 한건의 데이터이므로 Question 모델 객체 반환
만약 데이터들을 문자열로 반환받고 싶으면 모델을 정의한 클래스 안에 메소드를 추가해줍니다.(메서드 추가의 경우는 모델의 속성이 변경된 것이 아니기 때문에 makemigrations, migrate명령을 실행할 필요가 없습니다.)
class Question(models.Model):
subject = models.CharField(max_length=200)
content = models.TextField()
create_date = models.DateTimeField()
def __str__(self):
return self.subject
[ 데이터 수정 ]
데이터 수정은 q객체에 데이터조회하는 함수를 할당한 다음, 수정하고자하는 속성을 다시 작성하고 저장해줍니다.
>>> q = Question.objects.get(id=2)
>>> q
<Question: 장고 모델 질문입니다>
>>> q.subject = 'Django Model Question'
>>> q.save()
>>> q
<Question: Django Model Question>
[ 데이터 삭제 ]
데이터 삭제은 q객체에 데이터조회하는 함수를 할당한 다음, delete()로 삭제합니다
>>> q = Question.objects.get(id=1)
>>> q.delete()
(1, {'pybo.Question': 1})
# 삭제 후 확인해보면
>>> Question.objects.all()
<QuerySet [<Question: Django Model Question>]>
'Back-end > Django' 카테고리의 다른 글
[DRF] Django Rest Framework (0) | 2023.05.12 |
---|---|
[DRF] REST API란? (0) | 2023.05.10 |
[DRF] serializers (0) | 2023.05.08 |
Django URL 분리_include() 사용 (0) | 2022.09.25 |
Django 개발 흐름 (2) | 2022.09.25 |