2월 10, 2022

Django Tutorial ORM

  1. 클라이언트인 사용자가 요청을하면 Nginx 또는 Apache인 웹서버가 요청을 맞이함(개발시에는 경량 웹서버 사용하고, 상용으로 올릴때 Nginx또는 Apache사용)
  2. wsgi는 웹서버와 django 프레임워크를 연결하기 위해서 사용
  3. 요청이 넘어감
  4. 사용자가 요청한 특정 주소를 잘게 나누어줌 (parsing)
  5. 잘게 나눠진 주소들은 각각에 맞게 view로 이동함
  6. view에 따라 데이터베이스작업 등의 맞는 작업을 거침
  7. 디자인 담당인 템플릿으로 이동 된 후
  8. 사용자는 화면을 볼 수 있게 됨

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)

우선 모델에서 Choice와 Question 모델을 import한 뒤, Question의 내용을 Read합니다.


그런 다음,  데이터를 조회하여(read) reaad라는 변수에 저장합니다.


데이터 생성(Create)


위의 코드를 실행하여 Question 모델에 새로운 데이터를 create해봅니다


다시 한번 Question 모델을 조회하여 데이터가 잘 추가된 것을 확인할 수 있습니다


이런식으로 T라는 변수에 Question클래스의 객체를 저장하고, 이를 Queryset에 save해주는 방식으로도 데이터를 생성할 수 있습니다

데이터 업데이트(Update)


위의 코드로 데이터를 조회하고, 업데이트 해봅니다.
변수 O는 데이터 셋 내부의 값이 아닌, Question모델(클래스) 값을 받은 변수입니다. 따라서 O의 question_text 를 변경해주었다고 해도, O.save()를 통해 변경사항을 Question 모델에 직접 적용해주지 않는다면 QuerySet의 내용은 변화하지 않을것입니다. 


아래의 코드로 업데이트 된 내용이 적용됐음을 확인할 수 있습니다


Question 클래스의 함수인 was_published_recently()도 잘 작동합니다. 객체를 만들고 얼마 안가 바로 함수를 작동했으니 True가 나오는 것이 맞습니다.

데이터 삭제(Delete)



위의 코드로 만들어놓은 데이터를 Delete하고 결과를 확인해봅니다. 

끝으로 exit()을 통해 shell을 종료하고 빠져나옵니다.