본문 바로가기

Django

[Django] values(), values_list()

Django 에서 ORM을 통해 가져온 쿼리셋에서 특정 필드로 리스트를 만드는 작업을 하는 경우 

리스트를 만들기 위해 for 문과 append() 를 사용해 만들었었다.

>>> users = User.objects.all()
>>> user_name_list = []
>>> for user in users:
...     user_name_list.append(user.username)
>>> print(user_name_list)
['seo', 'kim', 'park']

SELECT "user_user"."id",
       "user_user"."username",
       "user_user"."email",
       "user_user"."password",
       "user_user"."fullname",
       "user_user"."join_date"
  FROM "user_user"

보통은 이런 방법을 만들었을 것이다.

이번에는 values_list() 를 사용해 만들어 보겠다.

flat 옵션은 True 일경우 리스트를 반환하고 False일 경우 튜플 타입을 반환한다. flat 옵션은 필드를 여러개 일때는 사용할수 없다.

>>> user_name_list = User.objects.all().values_list('username',flat=True)
>>> print(user_name_list)
<QuerySet ['kim', 'park', 'seo']>
SELECT "user_user"."username"
  FROM "user_user"
 LIMIT 21

 

 

가장 큰 차이는 쿼리문이다. 쿼리문을 살펴보면 values_list()를 사용한 쪽이 원하는 필드값만 가져와 최적화가 되어있는 모습을 볼 수 있다.

 

values() 는 원하는 필드를 선택, key, value형태로 값을 가져올수 있다.

>>> User.objects.all().values('username','id')
SELECT "user_user"."username",
       "user_user"."id"
  FROM "user_user"
 LIMIT 21
Execution time: 0.000503s [Database: default]
<QuerySet [{'username': 'kim', 'id': 2}, {'username': 'park', 'id': 3}, {'username': 'seo', 'id': 1}]>

 필드를 선택하지 않으면 모든 필드를 가져오게 된다.

 

ORM을 통해 가져오는 불필요한 데이터가 많을경우 사용하면 좋을거 같다.