Django

[Django] ORM에 대해 알아보자! (기초편)

chief 2022. 7. 12. 12:00
반응형

🚀  들어가며...

  • 제가 맡고있는 서비스는 기본적으로 회계프로그램이기 때문에 join 하는 테이블도 많고 쿼리문이 복잡하여 긴 쿼리문은 500줄이 넘어갑니다. 이러한 이유로 최초에 서비스 개발시에 Django ORM으로 개발을 시도하였다가 쿼리가 너무 복잡하여 포기하고 Postgresql을 이용하여 일반적인 쿼리문을 작성하여 개발하는 방식으로 바꾸었습니다. 하지만, Backend 개발자로써 ORM을 안쓴다고 아예 손을 놓아버리면 안된다고 생각을 하여.. (사실 ORM을 몰라서 안쓰는것과 ORM을 알고있지만 이런저런 이슈사항으로 쓰지 못하는 경우는 천지차이라고 생각합니다..) 개인공부를 하면서 차곡차곡 개념을 쌓아보고자 합니다.

 

📑 내용

# Django에서의 ORM

기본적인 동작원리는 아래 그림을 통해 알아봅시다.

 

Django의 MVT 패턴이 기억 안나시는 분들은 이전에 포스팅글을 참고해주시기 바랍니다.

https://chiefcoder.tistory.com/22?category=1046187

자, 이제 상세 개념과 실제 코드 예제를 통해 더 자세히 알아봅시다.

# Model

장고 모델은 DB 데이터를 정의하는 작업입니다. ORM(Object-relational mapping) 지원으로 선언하는 클래스가 DB의 테이블과 완변히 매칭됩니다.

1. 모델 만들기

models 패키지의 Model 객체를 상속받는 클래스가 하나의 DB테이블을 의미합니다.

특정 Field 클래스의 인스턴트로 생성되는 변수들이 해당 테이블의 한 필드가 됩니다.

필드 설정시, 필드 타입과 필드 옵션, 그리고 메타 옵션 등을 지정할 수 있습니다.

💌 소스코드

from django.db import models


class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    필드명 = models.필드_타입(필드_옵션)

    class Meta:
        ordering = ["first_name"]
        메타_옵션

 

2. 모델의 필드 타입과 필드 옵션

필드 타입 = 일반 필드 타입 + 관계 필드 타입

(각 필드 클래스 -> DB필드의 성격을 나타냅니다.)

 

3. 모델의 메타 옵션

메타 옵션 : 모델에 추가적인 정보 제공이나 기능을 수행할 수 있도록 하는 것을 뜻합니다.

 

4. 모델 관련 주요 함수

하나의 인스턴스 = 하나의 DB레코드

  • 모델인스턴스 = 모델클래스('값') : 레코드 생성 (메모리)
  • 모델인스턴스.필드 = '값' : 레코드 변경 (메모리)
  • 모델인스턴스.save() : 변경 이력을 실제로 반영(DB)
  • 모델인스턴스.delete() : 레코드
  • 변수 = 모델클래스.objects.all() : 전부 조회(배열 반환)
  • 변수 = 모델클래스.objects.get(필드=값) : 필드=값 조건 조회
  • 변수 = 모델클래스.objects.count() : 레코드 수

모델의 객체를 문자열로 출력하기 위한 메서드 선언

def __unicode__(self):    return self.변수
 

5. 모델 관련 주요 콘솔 명령

# 모델 변경 후, 실제 DB에 반영
python manage.py migrate

# 모델의 SQL을 직접 확인
python manage.py sql 앱이름

# 모델 작업을 Shell에서 직접하기
python manage.py shell​

 

# View

뷰는 MVC 패턴에서 Controller에 속합니다.

데이터를 입력받거나 표시하는 컴포넌트 역활을 합니다.

뷰의 함수가 특정 URL과 매치되어 템플릿을 제어합니다.

1. 템플릿 제어 방법

뷰에서 템플릿을 컨트롤하는 방법은 크게 3가지가 있는데, render render_to_response를 많이 사용합니다.

 

  • 풀어 쓰기
def main_page(request):
    template_object = get_template('템플릿명')
    context_object= Context({
        'key1':'value1',
        'key2':'value2',
    })
    output_html = template_object.render(context_object)
    HttpResponse(output_html)
 
  • render_to_response
def main_page(request):
    return render_to_response(
        'main_page.html',
        {
            'user':request.user,
        },
    )
 
  • render (저는 이방법으로 사용합니다.)
def main_page(request):
    return render(
        request,
        'main_page.html',
        {
            'user':request.user,
        },
    )​

 

🙋🏻‍♂️ 후기

이번 글은 Django ORM 관련글은 추가적으로 여러편에 걸쳐서 작성할 예정이오니, 많은 관심 부탁드립니다~!

 

🔗  참고한 글

https://heiswed.tistory.com/entry/%EC%9E%A5%EA%B3%A0Django-%EA%B0%9C%EB%B0%9C-%EB%B7%B0View

 

장고(Django) 개발: MVC 패턴, 뷰(View)

뷰는 MVC 패턴에서 Controller에 속하며, 데이터를 입력받거나 표시하는 컴포넌트이다. 뷰의 함수가 특정 URL과 매치되어 템플릿을 제어한다. 장고의 Model = Model 장고의 View = Controller 장고의 Template = V

heiswed.tistory.com

 

반응형