1. ORM
이전 글에서도 계속해서 등장하는 ORM이다. 장고의 모델과 실제 DataBase간의 통신에서 아주 중요하게 사용되는 기능이다. 이 ORM으로 실제 DB에 접속하지 않아도 파이썬 문법과 비슷한 형식으로 DB에 CRUD를 수행할 수 있다.
ORM의 실제 정의는 이곳에서 찾아볼 수 있다.
ORM이란 Object-Relational Mapping의 약자로 객체(Object)와 관계형 데이터베이스(Relational Database)의 데이터를 매핑(Mapping)해주는 것을 의미한다. 객체 간의 관계를 바탕으로 SQL을 자동 생성하여 sql쿼리문 없이도 데이터베이스의 데이터를 다룰 수 있게 해준다.
데이터베이스의 테이블을 객체지향 프로그래밍에서 흔히 사용하는 객체(Class)처럼 사용할 수 있도록 해주는 기술이다.
2. Manager
Manager는 데이터베이스 쿼리 작업이 Django 모델에 제공되는 인터페이스이다. 이 Manager를 통해 실제 table에 접근하여 생성, 조회, 수정, 삭제 (CRUD) 작업을 수행할 수 있다.

Manager가 수행할 수 있는 함수는 위와 같다. QuerySet은 table과 같은 2차원 형태로 instance들의 집합을 의미한다. QuerySet을 반환한다면 다시 한번 함수를 사용할 수 있지만 QuerySet을 반환하지 않는다면 불가능하다.
2.1. CRUD 함수
ORM에 의해 DB를 CRUD하는 함수들은 장고 쉘에서 직접적으로 사용할 수도 있고 models 함수나 view에서도 model을 불러와 사용할 때 사용될 수 있다.
2.1.1. QuerySet을 반환하는 함수
일반적으로 자주 쓰이는 함수들에 대해서 한번 짚고 넘어가자.
- 조회 (READ)
- all() : 모든 table의 instance들을 한번에 조회하는 기능
- order_by() : 쿼리문에서 사용되는 order by와 동일한 기능을 한다. order_by()에 의해 instance들이 정렬됨.
- order_by의 인자로는 field, 즉, column이 들어가고 두 개 이상 인자로 넣어줄 수 도 있다. 만약 Descending을 원할 때는 인자 앞에 '-'를 붙이면 된다.
- order_by같은 함수는 Model을 정의할 때에도 사용이 가능하다. 미리 모델에 Meta 내부 클래스로 정의해주면 인자로 넣어주는 field를 기준으로 항상 정렬이 되어있도록 만들 수 있다.
- filter() : 어떤 조건에 의해서 조회할 instance들을 filtering할 수 있다. 원하는 instance들만 조회할 수 있게 하는 기능.
- exclude() : filter와는 반대되는 함수로 인자로 들어가는 조건에 해당되는 instance들을 제외하고 조회할 수 있게 한다.
조회함수와 조건을 사용할 때 장고에서는 따라야하는 문법이 있다. (query문의 WHERE 절)
그 중 대표적으로 사용되는 것들이 아래에 해당된다.
- exact : 정확하게 어떤 값이 일치하는지를 의미한다. ( '=' 또는 '=='와 같은 의미)
- iexact : exact + 대소문자 구분 X

- contains : 어떤 값을 포함하는가의 의미, 대체로 텍스트 형식의 field에서 사용됨. (query 문에서 LIKE에 해당)
- icontains : contains + 대소문자 구분 X

- in : 해당 field값이 인자로 건네주는 값들 안에 있는지 의미. (query에서 동일하게 IN으로 사용됨)

- gt, gte, lt, lte (greater than, greater than or equal, less than, less than or equal) : 문자 그대로 대소 크기를 비교하기 위함. 대체로 숫자형 field에서 사용되고 왼쪽이 field값, 오른쪽이 비교값에 해당된다.

- startswith, endswith : contains와 비슷하게 query문에서 'LIKE'에 해당하지만 어떤 문자로 시작하는지 끝나는지를 조건으로 줄 수 있다. 즉, '%'가 들어간 'LIKE' 조건절과 동일하다.

- range : in과 비슷하게 지정해주는 어떤 값안에 속하는지 여부이다. 어떤 instance의 해당 field값이 비교값안에 속한다면 표시 아니면 표시 하지 않는다. in과 비슷하지만 비교값을 범위로 지정한다.

- year, month, day : 시간속성 field에서 year, month, day만을 추출하여 비교할 수 있는 조건절이다. gt, gte, lt, lte와 함께 사용가능하다.

위에서 조회에서 사용되는 조건절들을 살펴보았다. 모두 filter를 사용할 때 들어가는 조건임을 볼 수 있었고 가장 중요한 문법을 확인할 수 있었다. 바로 underbar(_)가 field와 조건절함수 사이에 두개가 들어간다는 것이다.
- field명__조건절 (year, month, day는 underbar를 한번더 사용해서 gt, gte, lt, lte도 사용가능)
위의 문법을 따라서 작성한다는 것을 잊지말자.
2.1.2. 조건문에서 AND 와 OR
조건에 맞는 instance들을 검색하기 위해 다양한 조건절을 사용할 수 있는 것을 위에서 확인했다. query문과 마찬가지로 AND와 OR로 여러가지 조건을 한번에 줄 수 있는 기능도 확인해보자.
먼저 AND 방법은 4가지 방법으로 사용될 수 있다. 추천되는 방법은 한가지인데 일단 4가지 방법을 모두 보자.
1. '&' 연산자 사용하기

위처럼 '&'연산자를 사용하는 방법은 먼저 각각의 filter를 통해 QuerySet을 뽑아낸다음 각각의 QuerySet에서 공통되는 instance들을 추출하겠다는 의미이다.
2. 조건절에서 여러개의 조건 인자로 주기

filter에 여러개의 조건절을 ','로 주면서 모두 만족하는 instance를 찾는 방식이다.
3. filter를 두 번 사용하기

filter를 사용하면 해당되는 instance들만 있는 QuerySet이 나오게 되는데 이 QuerySet을 한번더 filtering하면 두 개의 조건을 만족하는 QuerySet이 나오게 된다.
4. Q 메서드 사용하기

마지막 방법은 Q라는 메서드를 사용해서 filter함수 인자로 바로 '&'를 사용할 수 있게 하는 방법이다.
위 4가지 방법 중에서 가장 직관적이고 간단하게 사용될 수 있는 방법은 2번이다. 2번의 방법을 추천한다.
다음은 OR를 사용하는 방법 2가지이다.
1. '|' 연산자 사용하기

AND 방법 첫번째 방법과 같은 방식이다. 각각의 QuerySet을 뽑아내고 instance들을 합치는 방식.
2. Q 메서드 사용하기

AND 방법 중 4번째 방법과 동일한 방식이다.
2.1.3. QuerySet을 반환하지 않는 함수
이번에는 QuerySet을 반환하지 않는 함수들을 살펴보자.
조회
1. get() : 어떤 조건에 해당되는 instance 딱 하나만을 가져오는 함수. 만약 다수의 instance가 검색되거나 아예 검색되지 않는다면 에러가 발생한다.

위의 조회문들 중 마지막 조회문은 gt(greater than)을 사용하기 때문에 다수의 instance들이 검색된다. 때문에 아래와 같은 MultipleObjectsReturned 에러가 발생한다. ( 두 번째 조회문은 없는 instance → DoesNotExist 에러)

2. first() / last() : 현재 정렬되어있는 table에서 가장 처음, 마지막에 있는 instance를 조회한다.

3. count() : table에서 검색되는 instance들의 개수를 출력한다.

4. exists() : instance가 존재하는지 존재하지 않는지 여부를 알려준다. (보통 filter와 같이 사용됨)

추가
1. Model의 save() : 어떤 instance를 DB에 저장하기 위해 사용되는 메서드. Model에서 바로 실행된다.

Model의 save()는 Model 클래스를 객체로 받아서 인자를 넣어주는 과정과 저장하는 과정이 필요하다.
Model 객체를 사용할때만 가져다쓰기도 하기 때문에 저장하는 과정이 따로 존재하는 것이다.
2. Manager의 create() : Model의 save()와 다르게 직접적으로 DB를 생성하는 메서드.

Manager는 DB와 장고 사이를 상호작용하도록 하는 인터페이스이기 때문에 직접적으로 DB에 접근할 수 있다. 때문에 create 메서드는 Model.save() 메서드와는 다르게 바로 instance를 생성하는 메서드이다.
수정
1. Model.save() : 추가의 첫 번째 방법처럼 get을 사용하여 어떤 인스턴스(객체)를 가져온 뒤 그 객체의 속성을 변경하고 저장하는 방식이다.

2. QuerySet의 update() : get 대신 filter를 사용해서 instance가 아닌 instance들의 집합, QuerySet을 뽑아내고 해당 instance들의 속성을 한번에 바꾼 뒤 수정할 수 있다.

위 예시에서는 update한 instance가 하나밖에 없지만 여러 개일때도 모두 정상적으로 수정된다.
삭제
1. Model의 delete() : 하나의 instance(Model 객체)를 불러와 삭제하는 방식

2. QuerySet의 delete() : 여러 개의 instance를 가진 QuerySet을 검색하여 삭제하는 방식

수정의 2번째 방식과 마찬가지로 검색한 QuerySet을 모두 지우기 때문에 여러개의 instance들을 한번에 지울 수 있다.
2.1.4. Reference
http://www.incodom.kr/Django_ORM
생물정보 전문위키, 인코덤
Wikipedia for Bioinformatics
www.incodom.kr
https://www.incodom.kr/Django/Manager
생물정보 전문위키, 인코덤
Wikipedia for Bioinformatics
www.incodom.kr
https://djangojeng-e.github.io/2020/08/10/Django-Models-13%ED%8E%B8-Model-Attributes/
Django Models 13편 - Model Attributes
Model Attributes 모델의 가장 중요한 속성은 Manager 입니다. Manager 는 Django 데이터베이스 쿼리 운영을 제공 하는 인터페이스로, 데이터베이스에서 인스턴스들을 검색할때 사용 됩니다. 만약, 사용자
djangojeng-e.github.io
https://brownbears.tistory.com/434
[Django] Custom Manager, Custom QuerySet
Django 모델에서 Manager는 데이터베이스와 상호 작용하는 인터페이스입니다. 기본적으로 Manager는 Model.objects 속성을 통해 사용할 수 있습니다. Django 모델마다 기본적으로 사용되는 기본 관리자는 dj
brownbears.tistory.com
'웹' 카테고리의 다른 글
[Django] URL Reverse (0) | 2022.11.19 |
---|---|
[Django] 장고 Form (0) | 2022.11.19 |
[Django] 장고 Model 활용 (1) | 2022.11.19 |
[Django] Template 템플릿 (0) | 2022.11.15 |
[Django] 장고 기초, View와 Model (6) | 2022.11.14 |