Django – ORM values, values_list, list 결과
맨날 헷갈리는데 ORM Queryset 의 결과를 리스트로 받아 쓰는 경우가 많아 values(), values_list(), list()를 자주 쓰게 되는데 확실히 결과가 어떻게 다른지 알아보자.
말보단 코드를 짜서 결과를 보고 비교해 보는 게 확실히 이해하는데 크게 도움이 된다.
result_by_orderitem = Result.objects.filter(starttime__year=s_year).order_by("orderitem", "-starttime").distinct("orderitem").values("orderitem") print(result_by_orderitem) result_by_orderitem = Result.objects.filter(starttime__year=s_year).order_by("orderitem", "-starttime").distinct("orderitem").values_list("orderitem") print(result_by_orderitem) result_by_orderitem = Result.objects.filter(starttime__year=s_year).order_by("orderitem", "-starttime").distinct("orderitem").values_list("orderitem", flat=True) print(result_by_orderitem) result_by_orderitem = list(result_by_orderitem) print(result_by_orderitem)
예제로 짠 파이썬 코드의 결과를 보면,
<QuerySet [{'orderitem': 278}, {'orderitem': 279}, {'orderitem': 280}, {'orderitem': 284}, {'orderitem': 287}, {'orderitem': 288}]><QuerySet [(278,), (279,), (280,), (284,), (287,), (288,)]><QuerySet [278, 279, 280, 284, 287, 288]>[278, 279, 280, 284, 287, 288]
values 는 {필드명:값} 형태의 딕셔너리 형태의 Queryset 의 리스트 형태로 리턴 되어 있고
values_list 는 필드명을 지정해 둬서 튜플 형태의 (값, 값, …) 의 Queryset 리스트로 리턴되고,
plat=True
옵션을 주면 튜플 형태가 없어지고 그냥 값들의 리스트 형태와 유사한 Queryset 리스트를 리턴하고,
맨 마지막 값을 그냥 list(queryset)
형태로 호출하면, 그냥 순수한 값들의 리스트로 리턴되고 있음을 볼 수 있다.
..@vdekr9