Django Tutorial ORM
- 클라이언트인 사용자가 요청을하면 Nginx 또는 Apache인 웹서버가 요청을 맞이함(개발시에는 경량 웹서버 사용하고, 상용으로 올릴때 Nginx또는 Apache사용)
- wsgi는 웹서버와 django 프레임워크를 연결하기 위해서 사용
- 요청이 넘어감
- 사용자가 요청한 특정 주소를 잘게 나누어줌 (parsing)
- 잘게 나눠진 주소들은 각각에 맞게 view로 이동함
- view에 따라 데이터베이스작업 등의 맞는 작업을 거침
- 디자인 담당인 템플릿으로 이동 된 후
- 사용자는 화면을 볼 수 있게 됨
Django의 전체적인 사이클입니다.
이중에서도 6번 부분에 대해 코드를 보며 자세히 알아보겠습니다.
빨간 박스로 표시된 부분은 모델과 데이터베이스간의 소통을 보여줍니다. 이를 ORM(Object-Relation-Mapping)이라 합니다. 무슨 뜻이냐면, 데이터베이스의 테이블을 객체(object)와 연결하여서, 테이블에 CRUD를 할 때, SQL쿼리를 사용하지 않고도 CRUD를 가능하게 하는 것을 말합니다.
즉, 장고의 각 앱 안에 있는 models.py에 생성된 각 모델은 데이터베이스 테이블과 mapping(연결) 돼 있다는 것입니다.
장고 튜토리얼의 mysite/polls/models.py 의 코드를 먼저 보시겠습니다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import datetime from django.db import models from django.utils import timezone # Create your models here. class Question(models.Model): id = models.AutoField(primary_key=True) question_text = models.CharField(max_length=200) #질문내용 pub_date = models.DateTimeField('date published') #생성날짜 def __str__(self): #object.all을 했을때 구분가능하게 하기 위해 __str__ 메소드 사용 return self.question_text def was_published_recently(self): return self.pub_date >= timezone.now() - datetime.timedelta(days=1) #커스텀메소드 추가 #현재로부터 하루 차감한 값(어제) 이후(>=) 에 발행된 데이터가 return #timedelta(days=1) means "1일전" # ex) datetime.now() - timedelta(hours=3) means 현재로부터 세시간 전 class Choice(models.Model): question = models.ForeignKey(Question, on_delete=models.CASCADE) #선택지에 해당하는 질문,외래키(question참조) #Question 클래스가 삭제되면, 바로 위의 이 question도 삭제가 되겠다 choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0) #투표수 def __str__(self): return self.choice_text |
이 모델을 사용하여 데이터베이스에 CRUD를 해보겠습니다.
python manage.py shell 로 우선 쉘을 실행해줍니다.
데이터 조회(Read)
데이터 생성(Create)
위의 코드를 실행하여 Question 모델에 새로운 데이터를 create해봅니다
데이터 업데이트(Update)
변수 O는 데이터 셋 내부의 값이 아닌, Question모델(클래스) 값을 받은 변수입니다. 따라서 O의 question_text 를 변경해주었다고 해도, O.save()를 통해 변경사항을 Question 모델에 직접 적용해주지 않는다면 QuerySet의 내용은 변화하지 않을것입니다.
아래의 코드로 업데이트 된 내용이 적용됐음을 확인할 수 있습니다
데이터 삭제(Delete)
끝으로 exit()을 통해 shell을 종료하고 빠져나옵니다.