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

Share: Twitter Facebook
Bongjun Hur's Picture

About Bongjun Hur

BJ is a dev.

Seoul, Korea https://devbj.com