[Django] filter / exists

김광일·2022년 2월 23일
0

DJANGO

목록 보기
6/8
post-thumbnail

오늘은 filter()exists()의 차이에 대해서 포스팅을 해보려한다.

# xxx 가 참일 경우
if xxx: # = True
	return True
else:
	return False
> True

# xxx 가 거짓일 경우
if xxx: # = False
	return True
else:
	return False
-> False

xxx의 내용이 참일 경우 바로 if 문의 return 값을 반환해주게 되는데, 나는 이 때 잊고 있던 사실이 있었다.

bool(0)   # False
bool([])  # False
bool({})  # False
bool(())  # False
bool('')  # False
bool(1)   # True
bool('b') # True

if xxx문에서 xxx 가 빈 값이나 0 인지(False) 아닌지(not False = True)를 보면 되는데, exists()를 사용하여 값의 유무를 확인해야만 거짓을 판별할 수 있다는 착각을 하고 있었다.

이것을 보고나니 문득 그렇다면 get이나 filter만 사용하더라도 TrueFalse를 구할 수 있을텐데, exists()를 사용하는 이유가 무엇인가? 하는 의문이 생겼다.

그 이유로는 결과적으로 봤을 때 연산 속도라고 볼 수 있는 것 같다.

filter에는 lazy evaluation, 즉 찾은 값을 찾는다고 바로 db에 전달하지 않고 가지고 있다가 필요한 순간에 전달하는 특성이 있는데 , existsfilter 뒤에 사용하기 때문에 같은 상황이 아닌가? 싶지만 그 과정에서 조금 다른 게 아닐까 싶다.

초등학교 체육대회를 예를 들어 생각해 보자면 filter의 경우엔 조건에 충족하는 사람을 찾으면 데리고 오는 것과, 조건에 충족하는 사람을 발견하면 바로 돌아오는 것 중 어느 상황이 더 빠를지 생각하면 쉬운 것 같다.
때문에 filter는 해당 쿼리셋을 불러오지만 existsTrue와 False만 가져오게 된다.


물론 개인이 이해한 바를 바탕으로 작성하였기 때문에 혹 오류가 있다면 누구든 언제든 알려주시길 바랍니다.

참고 사이트
참고 1
참고 2
참고 3

profile
부족함 없이 공부하자

0개의 댓글