합칠 대상의 결과가 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()을 상황에 맞게 사용하면 됩니다.

+ Random Posts