본문 바로가기

Python/Django

values_list(), values() method in Django

728x90
반응형

Django의 QuerySet API 중에

 

values_list() 와 values()가 있습니다.

 

 

values_list()는 filter method 등으로  불러온 QuerySet 결과값들을 tupple이 담긴 list 형태로 바로 만들어주고

 

values()는 QuerySet 결과값들을 dictionary가 담긴 list 형태로 바로 만들어줍니다.

 

 

Django 프로젝트를 만들고 다음과 같이 예제를 살펴보겠습니다.

# models.py

from django.db import models

class Fruits(models.Model):
    name = models.CharField(max_length=30)
    price = models.PositiveIntegerField()
    grade = models.PositiveIntegerField()
    group = models.PositiveIntegerField()

name을 0~99999까지, price를 100000~199999까지, grade를 200000~299999까지 짝지어서 만들고

name 0~49999까지 group=1로 지정

 

 

values_list()는 해당하는 table의 field 값들을 tuple로 묶어서 list 형태의 QuerySet 리턴

values()는 해당하는 table의 field 값들을 dictionary로 묶어서 list 형태의 QuerySet 리턴

def fruit_view4(request):
    fruits_group_values_list = Fruits.objects.filter(group=1).values_list()
    fruits_group_values = Fruits.objects.filter(group=1).values()

    print(fruits_group_values_list)
    print(fruits_group_values)
    return JsonResponse({'status':'view4_success'})

<QuerySet [(1, '0', 10, 20, 1), (2, '1', 11, 21, 1), (3, '2', 12, 22, 1), (4, '3', 13, 23, 1), (5, '4', 14, 24, 1), (6, '5', 15, 25, 1), (7, '6', 16, 26, 1), (8, '7', 17, 27, 1), (9, '8', 18, 28, 1), (10, '9', 19, 29, 1), (11, '10', 1010, 2010, 1), (12, '11', 1011, 2011, 1), (13, '12', 1012, 2012, 1), (14, '13', 1013, 2013, 1), (15, '14', 1014, 2014, 1), (16, '15', 1015, 2015, 1), (17, '16', 1016, 2016, 1), (18, '17', 1017, 2017, 1), (19, '18', 1018, 2018, 1), (20, '19', 1019, 2019, 1), '...(remaining elements truncated)...']>

 

<QuerySet [{'id': 1, 'name': '0', 'price': 10, 'grade': 20, 'group': 1}, {'id': 2, 'name': '1', 'price': 11, 'grade': 21, 'group': 1}, {'id': 3, 'name': '2', 'price': 12, 'grade': 22, 'group': 1}, {'id': 4, 'name': '3', 'price': 13, 'grade': 23, 'group': 1}, {'id': 5, 'name': '4', 'price': 14, 'grade': 24, 'group': 1}, {'id': 6, 'name': '5', 'price': 15, 'grade': 25, 'group': 1}, {'id': 7, 'name': '6', 'price': 16, 'grade': 26, 'group': 1}, {'id': 8, 'name': '7', 'price': 17, 'grade': 27, 'group': 1}, {'id': 9, 'name': '8', 'price': 18, 'grade': 28, 'group': 1}, {'id': 10, 'name': '9', 'price': 19, 'grade': 29, 'group': 1}, {'id': 11, 'name': '10', 'price': 1010, 'grade': 2010, 'group': 1}, {'id': 12, 'name': '11', 'price': 1011, 'grade': 2011, 'group': 1}, {'id': 13, 'name': '12', 'price': 1012, 'grade': 2012, 'group': 1}, {'id': 14, 'name': '13', 'price': 1013, 'grade': 2013, 'group': 1}, {'id': 15, 'name': '14', 'price': 1014, 'grade': 2014, 'group': 1}, {'id': 16, 'name': '15', 'price': 1015, 'grade': 2015, 'group': 1}, {'id': 17, 'name': '16', 'price': 1016, 'grade': 2016, 'group': 1}, {'id': 18, 'name': '17', 'price': 1017, 'grade': 2017, 'group': 1}, {'id': 19, 'name': '18', 'price': 1018, 'grade': 2018, 'group': 1}, {'id': 20, 'name': '19', 'price': 1019, 'grade': 2019, 'group': 1}, '...(remaining elements truncated)...']>

 

 

원하는 field만 선택해서 넣을 수 있습니다.

def fruit_view4(request):
    fruits_group_values_list = Fruits.objects.filter(group=1).values_list('name', 'group')
    fruits_group_values = Fruits.objects.filter(group=1).values('name', 'group')

    print(fruits_group_values_list)
    print(fruits_group_values)
    return JsonResponse({'status':'view4_success'})

<QuerySet [('0', 1), ('1', 1), ('2', 1), ('3', 1), ('4', 1), ('5', 1), ('6', 1), ('7', 1), ('8', 1), ('9', 1), ('10', 1), ('11', 1), ('12', 1), ('13', 1), ('14', 1), ('15', 1), ('16', 1), ('17', 1), ('18', 1), ('19', 1), '...(remaining elements truncated)...']>

 

<QuerySet [{'name': '0', 'group': 1}, {'name': '1', 'group': 1}, {'name': '2', 'group': 1}, {'name': '3', 'group': 1}, {'name': '4', 'group': 1}, {'name': '5', 'group': 1}, {'name': '6', 'group': 1}, {'name': '7', 'group': 1}, {'name': '8', 'group': 1}, {'name': '9', 'group': 1}, {'name': '10', 'group': 1}, {'name': '11', 'group': 1}, {'name': '12', 'group': 1}, {'name': '13', 'group': 1}, {'name': '14', 'group': 1}, {'name': '15', 'group': 1}, {'name': '16', 'group': 1}, {'name': '17', 'group': 1}, {'name': '18', 'group': 1}, {'name': '19', 'group': 1}, '...(remaining elements truncated)...']>

 

 

value_list('name', flat=True)

values_list()는 하나의 field만 string으로 담은 list를 얻고 싶은 경우 flat=True 조건을 걸어주면 됩니다.

fruits_group_values_list = Fruits.objects.filter(group=1).values_list('name', flat=True)

print(fruits_group_values_list)

<QuerySet ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '...(remaining elements truncated)...']>

 

 

* 성능 테스트

1) for 문 돌면서 list 만들기

2) list comprehension으로 list 만들기

3) values_list로 뽑아오기

def fruit_view2(request):
    start1 = time.time()
    fruits_group = Fruits.objects.filter(group=1)
    fruits_group_list = []
    for i in fruits_group:
        fruits_group_list.append(i.name)
    print(len(fruits_group_list))
    finish1 = time.time()
    print(finish1-start1)
    
    start2 = time.time()
    fruits_group_re = Fruits.objects.filter(group=1)
    fruits_group_list_comprehension = [i.name for i in fruits_group_re]
    print(len(fruits_group_list_comprehension))
    finish2 = time.time()
    print(finish2-start2)

    start3 = time.time()
    fruits_group_values_list = Fruits.objects.filter(group=1).values_list('name', flat=True)
    print(len(fruits_group_values_list))
    finish3 = time.time()
    print(finish3-start3)
    
    return JsonResponse({'status':'view2_success'})

50000
0.5119662284851074


50000
0.44581127166748047


50000
0.07176709175109863

 

가장 아래의 결과값을 보면 values_list가 월등히 빠른것을 확인 가능합니다.

728x90
반응형