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 |