6. 필요한 열만 골라 조회하려면 어떻게 하나요?

_images/usertable.png

auth_user 모델에는 여러 개의 필드가 정의되어 있습니다. 그런데 이 필드가 전부 다 필요하지 않을 때도 있죠. 그럴 때 필요한 열만을 데이터베이스에서 읽어오는 방법을 알아 봅시다.

장고는 두 가지 방법을 제공합니다.

  • 쿼리셋의 values 메서드와 values_list 메서드
  • only 메서드

이름이 R로 시작하는 모든 사용자의 이름(first_name)과 성(last_name)을 구해 봅시다. 데이터베이스 시스템의 부하를 줄이기 위해 그 외의 열은 가져오지 않겠습니다.

>>> User.objects.filter(
    first_name__startswith='R'
).values('first_name', 'last_name')
<QuerySet [{'first_name': 'Ricky', 'last_name': 'Dayal'}, {'first_name': 'Ritesh', 'last_name': 'Deshmukh'}, {'first_name': 'Radha', 'last_name': 'George'}, {'first_name': 'Raghu', 'last_name': 'Khan'}, {'first_name': 'Rishabh', 'last_name': 'Deol'}]

str(queryset.query) 으로 실제로 실행되는 SQL 질의문을 확인할 수 있습니다. 다음과 같은 질의문이 실행되었습니다.

SELECT "auth_user"."first_name", "auth_user"."last_name"
FROM "auth_user" WHERE "auth_user"."first_name"::text LIKE R%

실행 결과는 사전의 리스트입니다.

한편, only 메서드를 사용할 수도 있습니다.

>> queryset = User.objects.filter(
    first_name__startswith='R'
).only("first_name", "last_name")

str(queryset.query) 로 SQL 질의문을 확인해 봅시다.

SELECT "auth_user"."id", "auth_user"."first_name", "auth_user"."last_name"
FROM "auth_user" WHERE "auth_user"."first_name"::text LIKE R%

only 메서드가 values 메서드와 다른 점은 id 필드를 함께 가져온다는 점 뿐입니다.