ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Django] queryset 결과 합치기
    언어/파이썬 & 장고 2019. 1. 22. 21:24

    합칠 대상의 결과가 2개 이상인 경우

    union()

    union()를 사용해서 1개로 합칠 수 있습니다. union()의 2번째 인자는 중복을 허용할지에 대한 여부인데 기본값은 False로 중복을 허용하지 않습니다. (중복데이터일 경우 중복제거)

    result = a.union(b, all=True)

    결과가 쿼리셋 리스트 타입이기 때문에 ORM 형식을 그대로 사용할 수 있습니다.

    | 연산자

    | 연산자를 사용하여 손쉽게 쿼리셋 타입 리스트를 합칠 수 있습니다.

    result = a | b

    결과가 쿼리셋 리스트 타입이기 때문에 ORM 형식을 그대로 사용할 수 있습니다.

    + 연산자

    + 연산자를 사용하기 위해선 각 쿼리셋 리스트 타입을 일반 리스트 타입으로 변경한 후 합칩니다.

    a = list(a)
    b = list(b)
    result = a + b

    합칠 대상이 단일일 경우

    합칠 대상이 2개 이상이 아닌 1개만 존재하는 경우, 위의 방법을 전부 사용하지 못합니다.

    chain()

    chain() 함수를 사용하면 대상이 단일 건이거나 복수개여도 언제든지 합칠 수 있습니다.

    from itertools import chain
    result = list(chain(a, b))

    list 변환 후 병합

    쿼리셋 리스트 타입을 리스트로 변환 후, 단일건을 해당 리스트에 추가하는 형식입니다.

    a = list(a)
    a.append(b)

    limit이 걸려있는 쿼리셋 리스트일 경우

    limit이 걸려있는 경우에는 | 연산자 방식을 제외하고 전부 사용할 수 있습니다.

    결론

    병합에는 여러 방법이 있지만 가장 좋은 방법은 ORM에서 제공하는 union()과 chain() 입니다. 쿼리 결과를 병합하는 것을 지양해야 하지만 어쩔 수 없이 사용해야 한다면 union()과 chain()을 상황에 맞게 사용하면 됩니다.

    댓글