본문 바로가기
AI 웹개발반/Python, Django

[Django] QuerySet 메서드와 filter option

by 째깍단 2023. 6. 29.

 

Django의 메서드를 정리해보자

 

 

주로 아래와 같이 작성하여 사용한다.

 

Model.object.all()

 

 

장고 메서드

 

all() 해당 테이블의 모든 데이터 셋 가져오기
filter() 특정 조건을 만족하는는 데이터셋 가져오기 (QuerySet형태)
get() 특정 조건을 만족하는 1개 데이터 가져오기 (없으면 오류나므로 확실한 데이터를 요청해야함!)
exclude() 특정 조건을 제외한 데이터셋 가져오기
   
  아래 두 메서드는 ORM 최적화를 위한 장고 기본 제공 메서드
둘 모두 DB 접근횟수를 줄이고 더 빠르게 데이터를 조회할 수 있게 돕는다.
때문에 위 메서드들과 함께 사용하는 경우가 많음!

-> related_name을 적용할 수 있다
-> 괄호 안에 테이블, 클래스 명을 여러개 지정 할 수 있다
-> 괄호안에 빈값 = null값 필드를 제외한 모든 필드를 가져온다
prefetch_related() 객체가 정참조인 여러개의 객체를 참조 - multiple objects (manytomany or onetomany) -이거나, 또는 역참조 Foreign Key인 객체를 조회할 수 있음
select_related() 객체가 역참조하는 1개의 객체 - single object (onetoone or manytoone) - 이거나, 정참조 (foreign key) 관계인 객체를 조회할 수 있음

 

 

 

+ 보통 위의 메서드에 함께 붙여서 사용하는 메서드들

count() 요청한 데이터의 개수 가져오기
first() 찾은 데이터 중 첫번째 데이터 가져오기  filter/all등과 함께 사용
last() 찾은 데이터 중 마지막 데이터 가져오기             "
exists() 데이터 유무를 확인해 True, False 가져오기
order_by() 특정 필드 순서대로 정렬  |  () 안에 테이블, - 등의 옵션을 추가

 

 


 

 

 

filter options

 

 

 

* filter를 사용할 때 꼭 알아두어야하는 부분!

  • __ 언더바 2개
    • 조건을 사용한 경우
    • 외부 모델 필드를 사용할 경우

 

예시 :

# 언더바 참고 
# 조건
Model.objects.filter(id__exact = request.user.id)
Model.objects.filter(title__contains="string")

# 외부 모델 참조
Feed.objects.filter(category__community=community)
Feed.objects.filter(comment__user__profile = request.user.nickname)

 

 

 

 

 

* filter 로 조건을 검색할때 filter의 괄호 안에 상세 조건을 넣거나, 장고 메서드에 붙여 사용할 수 있다.

 

 

 

- exact   iexact

 

입력과 일치하는 조건을 입력할때 사용

iexact는 대소문자를 가리지 않고 일치하는 조건을 찾아줌

 

Model.objects.filter(name__exact = "Dan") # 대소문자 맞는 것만 찾아옴
Model.objects.filter(name__iexact = "Dan") # 대소문자 구분x

 

 

 

 

- contains    icontains

 

일부가 일치하는 조건을 입력할 때 사용

icontains 대소문자 가리지 않고 일부 일치 찾음

 

Model.objects.filter(name__contains = "Dan")
Model.objects.filter(name__icontains = "Dan")

 

 

 

 

- in

여러 조건을 포함하는 경우

 

Model.objects.filter(name__in = ["dan", "minsu"])

 

 

예시 : 쿼리 요청을 줄이기 위해 query list에 __in을 사용하여 filter적용

 

follow_id_list = user_serializer['follower'] +user_serializer['following']
follow_list = Follow.objects.filter(id__in=follow_id_list)

 

 

 

 

 

- gt / lt / gte / lte

 

gt  : greater than  >

lt  : less than  <

gte  : greater than or equal  >=

lte  : less than or equal  <=

eq  : equal  =, ==

ne  : not equal  !=

 

 

테이블, 날짜나 시간도 비교 및 필터링이 가능하다

 

Feed.objects.filter(id__lt=feed_id)

 

Feed.objects.filter(created_at__gte=datetime.date(2023.05.30))

 

 

 

 

- startswith / endswith

 

startswith : 조건으로 시작하는 문자열 검색
endswith : 조건으로 끝나는 문자열 검색

 

Feed.objects.filter(title__startswith="공지")

 

 

 

 

union

 

두 개 이상의 QuerySet 을 하나의 QuerySet으로 합친다

 

data1 = Feed.objects.filter(title__exact="재료")
data2 = Feed.objects.filter(title__exact="요리")
sum_data = union(data1, data2)

 

 

 

intersecion

 

교집합으로  두 개 이상의 QuerySet 변수 값을 가져온다

 

data1 = Feed.objects.filter(title__in="재료")
data2 = Feed.objects.filter(title__in="요리")
교집합_data = intersection(data1, data2)