본문 바로가기
개발일지/Django

Django - get, filter, Q, lookup, order_by

by 개발에정착하고싶다 2022. 9. 30.

# get()

 

get()은

보통 쓰일때, 미리 class를 만들어줘야하며

클래스명.objects.get(조건)

이렇게 쓰인다.

 

그리고 get()에서 조건을 통해 가져올 수 있는것은 오직 1개의 result이며

2개이상은 에러가 난다.


# filter()

 

filter()는 get과 사용방식은 같다.

하지만 조건에 맞는것을 모두 리턴한다.

 

실제로 쓰인 코드는 이렇게 쓰였다.

 

Patient.objects.filter(last_name=‘smith’)

 

만약 필터로 쓰고 싶은 조건이 1개가 아니라 2개 이상으로

더 세부적으로 검색하고 싶다면

Patient.objects.filter(last_name=‘smith’).filter(age<40)

이런식으로

last_name이 smith이고

나이다 40 미만인 사람들로 추려볼 수도 있다.


# Q

 

Q는 사실 굳이 왜 사용해야하는가? 싶지만

추후 look up(룩업)같은 복잡한 기능을 다룰때 사용되는 거라고 한다.

look up은 배웠지만 뭔지는 정확히 모르겠네

 

Q는 기본적으로 or조건 혹은 and 조건으로 사용될 수 있고

이것을 사용하기 위해서는 모듈을 임포트 해야한다.

 

from django.db.models import Q

 

그리고 사용 예시는

Patient.objects.filter(Q(last_name='smith')& Q(age=40)).all()

 

이렇게 하였으며 여기서 주의점은

1.&는 and 를 의미하며 or의 조건을 원한다면 | 로 대체해주면 된다.

2.all()은 굳이 안써도 사용엔 문제가 없는것 같다.


# look up(룩업)

 

# 예시1

# last_name이 s로 시작하는 자료를 찾아줘

Patient.objects.filter(last_name__startswith = 's').all()

 

# 예시2

age가 20, 30, 40 중에 해당사항이 있다면 리턴해줘

Patient.objects.filter(age__in = [20,30,40]).all()

 

# 예시3

gte는 greater then or equal 이라는 의미로써

‘크거나 같음’ 을 의미한다.

더 쉽게는 ‘이상’

# age가 39세 이상인 자료를 찾아줘

Patient.objects.filter(age__gte = 39).all()

 

그외 gte와 같은 내장함수는

https://docs.djangoproject.com/en/4.1/ref/models/querysets/#field-lookups

여기를 참고하자.

이것은 django API공식문서로써 매우 중요하다.


# order_by 정리

 

예시

Patient.objects.order_by('age').all()