본문 바로가기
Code/Python & Django

[Django] Django의 ORM : get() 과 filter() 비교

by 코드포휴먼 2020. 6. 17.

Django ORM을 작성하면서 SQL문을 확인하곤 한다.

오류를 발견하면서 헷갈리는 get() 과 filter()을 간단히 정리한다.

 

fetchone 

# ORM
User.objects.get(id=1)   #Return : Object
# SQL
SELECT * FROM accounts_user WHERE id=1;

get()은 쿼리에 맞는 객체 하나( [0]번째 )만 반환해준다. 

filter().first()와 같다.

쿼리에 맞는 결과가 없을 시 DoesNotExist 에러가 발생한다.

 

그런데 get()은 객체를 반환한다는 것에 주의한다. 예를 들어보겠다.

python manage.py shell 명령어를 입력하거나 PyCharm을 쓴다면 python console로 간다.

작성한 app의 models.py에서 User 모델을 import한다.

from accounts.models import User

 

그리고 id가 4인 객체를 get하는 ORM을 작성한다.

 

query 속성과 str() 함수를 통해 ORM을 sql문으로 확인할 수 있다.

그러나 변수 queryset은 객체이기 때문에 .query 속성을 가지지 않아서 접근할 수 없었다. 

 

반면 파이썬 내장함수인 str()로 객체를 출력하는 것은 가능했다. 

 

객체가 이메일로 대표된 이유는 User 모델 클래스의 __str_() 메소드 리턴값이 이용되기 때문이다.

 

한편 get()이 반환하는 유형이 객체이므로 .속성 으로 객체가 가진 다른 속성값에는 접근이 가능하다.

 

 

fetchall

# ORM
User.objects.filter(id=1)   #Return : QuerySet
# SQL
SELECT * FROM accounts_user WHERE id=1;

filter()는 조건에 맞는 쿼리셋( 객체 여러개 )을 반환한다.

 

쿼리셋에는 query 속성이 존재하므로 str() 함수와 함께 ORM을 sql문으로 확인할 수 있다.

 

댓글