Framework/Django

Queryset method 정리

JM Lee 2023. 6. 20. 13:41
728x90

Queryset

Django ORM에서 제공하는 데이터 타입으로, 데이터베이스에서 전달받은 모델의 객체 목록

클래스 모델 중 필터링하는 select, 값을 만드는 create, 값을 변경해주는 update로 나뉨

 

 

1. select

클래스 명.objects.all()

: 해당 테이블 안에 있는 모든 데이터 조회. QuerySet 타입으로 반환.

클래스 명.objects.get()

: 하나의 row만 조회. 주로 pk컬럼으로 조회한다. 결과가 1건 이상일 때는 에러를 발생시킨다. QeuerySet 타입이 아닌 객체 타입으로 반환.

클래스 명.objects.filter()

: 특정 조건에 맞는 row만 조회하고 싶을 때 사용한다. QuerySet 타입으로 반환.

클래스 명.objects.exclude()

: 특정 조건을 제외한 데이터만 조회하고 싶을 때 사용한다. QuerySet 타입으로 반환.

   __contains : 특정 문자가 포함된 것을 찾을 때 사용 (대소문자 구분)

   __icontains : 특정 문자가 포함된 것을 찾을 때 사용 (대소문자를 구분하지 않음)

   __startswith : 특정 문자로 시작하는 것을 찾을 때 사용

   __endswith : 특정 문자로 나는 것을 찾을 때 사용

   __gt : 특정 값 보다 큰 데이터만 조회 (greater than의 약자) 

   __lt : 특정 값 보다 작은 데이터만 조회 (less than의 약자)

   __isnull : True로 지정 시 특정 필드 값이 null인 것만 조회

   __in : 리스트 안에 지정한 문자열들 중에 하나라도 포함된 데이터를 찾을 때 사용 (단, 문자열과 정확히 일치해야함)

   __year, __month, __day, __date : date 타입의 필드에서 특정 년(__year), 월(__month), 일(__day) 혹은 특정 날짜       (__date : YY-MM-DD 형식)의 데이터를 찾을 때 사용

 

AND / OR

filter() 메소드 사용 시, 두개 이상의 조건을 AND 또는 OR을 이용하여 표현할 수 있다.

- AND 조건 : 두 개 이상의 쿼리 셋을 '&' 로 연결

- OR 조건 : 두 개 이상의 퀴리 셋을 '|'로 연결

클래스 명.objects.count()

: 쿼리 셋에 포함된 데이터 개수를 리턴한다.

클래스 명.objects.exists()

: 해당 테이블에 데이터가 있는지 확인. 있으면 True, 없으면 False 반환.

클래스 명.objects.values()

: QuerySet의 내용 딕셔너리 형태로 반환한다. 인자값에 아무 것도 넣지 않으면 해당 클래스의 모든 필드와 그 값을 보여주고, 인자값에 특정 필드를 입력하면 입력한 필드에 대한 값을 반환한다.

클래스 명.objects.values_list()

: values()와 같으나 QuerySet의 내용을 딕셔너리가 아닌 리스트 타입으로 반환

클래스 명.objects.order_by()

: 특점 필드를 기준으로 정렬을 할 때 사용. 필드명 앞에 -가 붙으면 내림차순을 의미한다.

클래스 명.objects.first(), [클래스 명].objects.last()

: 쿼리 셋 결과 중 가장 첫번째 row만 조회할 때 사용, 쿼리 셋 결과 중 가장 마지막 row만 조회할 때 사용. 둘 다 객체 타입 반환.

클래스 명.objects.aggregate()

: django의 집계함수 모듈(Avg, Max, Min, Count, Sum 등)을 사용할 때 사용하는 메소드. 집계함수들을 파라미터로 받는다.

딕셔너리 타입으로 반환한다.

클래스 명.objects.annotate()

: annotate은 주석이라는 뜻인데, annotate()는 각 컬럼별 주석을 달고 집계함수를 사용하여 반환한다.

 SQL의 group by 절과 같은 의미라고 생각하면 된다. 결과는 QuerySet 형태로 반환한다.

 

 

* chaining Methods

: 여러 메소드를 .으로 연결해서 사용할 수도 있다.

* slicing

: 쿼리 셋 결과를 인덱스 slicing 하는 것 처럼 slicing 할 수 있다.

 

2. insert

클래스 명.objects.create()

클래스 명.objects.bulk_create()

: 여러 개의 object를 한꺼번에 생성할 때 사용

클래스 명.objects.get_or_create()

: 해당 테이블에 조건에 맞는 데이터가 이미 존재하면 get을 해오고, 없으면 create하는 메소드.

  튜플 타입을 반환해주는데 (get 또는 create한 객체, True/False) 형식으로 반환해준다.

  여기서 True/False는 이미 존재하는 데이터면(=get하는 경우) False, 없는 데이터면(=create하는 경우) True를 의미.

단, 이렇게 create된 데이터는 나머지 컬럼에 '' 또는 null 또는 default 값이 자동으로 채워진다.
따라서 위 예시처럼 쓰는 것 보단 get_or_create()의 괄호 안에 그냥 create를 하는 것 처럼 써 주는게 좋다.

 

 

3. update

업데이트 할 row를 변수에 저장을 하고 그 변수에서 각 필드에 접근하여 값을 변경해주는 방법. 반드시 .save()를 해줘야 변경사항이 저장됨.

또 다른 방법 :  filter().update()

 

 

4. delete

삭제 할 row를 변수에 저장을 하고 그 변수에서 .delete() 메소드로 해당 데이터 삭제한다.

'Framework > Django' 카테고리의 다른 글

장고 Q 사용 (Code Refactoring)  (2) 2023.06.23
taggit 공식 문서 읽어보기  (0) 2023.06.21
시리얼라이저 오버라이딩  (0) 2023.06.19
generics.ListCreateAPIView  (0) 2023.06.19
MtoM 마이그레이션 오류(through 옵션)  (0) 2023.06.16