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을 통해 가져오는 불필요한 데이터가 많을경우 사용하면 좋을거 같다.
'Django' 카테고리의 다른 글
Django CSRF (0) | 2023.03.18 |
---|---|
Django 유저모델 Email필드로 로그인 (0) | 2023.03.14 |
[Django] Django-extensions shell_plus 로 쿼리 확인하기 (0) | 2023.01.15 |
Django,RuntimeWarning: DateTimeField received a naive datetime while time zone support is active. (0) | 2023.01.09 |