-
[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()을 상황에 맞게 사용하면 됩니다.