2010-12-10 3 views
50

두 개의 사용자 정의 관리자 메소드가있는 장고 모델이 있습니다. 각각은 객체의 다른 속성을 기반으로 모델 객체의 다른 하위 세트를 반환합니다.두 장고 쿼리 세트의 결합을 어떻게 찾을 수 있습니까?

각 관리자 메소드에서 반환 된 쿼리 세트의 합집합 인 쿼리 세트 또는 객체 목록을 가져 오는 방법이 있습니까?

+2

(삭제 된 답변에서) 다른 모델의 QuerySets와 호환되는 변형에 대해이 질문을 참조하십시오. http://stackoverflow.com/questions/431628/how-to-combine-2-or-more-querysets-in -a-django-view – rnevius

+1

버전 1.11부터 django 질의 세트에는 내장 된 내장 메소드가 있습니다. 난 미래의 참조에 대한 답변으로 추가했습니다 –

답변

127

이 작동하고 조금 청소기 같습니다 당신이 중복되지 않도록하려면

records = query1 | query2 

는, 당신은 .distinct()를 추가해야합니다

records = (query1 | query2).distinct() 
+4

허용 대답은 노조 iterable (정확하게 될 목록), OP가 요청한 것처럼 반환하지만,이 방법은 querysets의 진정한 조합을 반환합니다. 이 쿼리 세트는 더 많은 작업을 할 수 있으며, 이는 많은 경우에 필요합니다. –

+4

Django 버그로 인해,이 구조는'ManyToManyField'를 처리 할 때 때로는 잘못된 결과를 반환 할 수 있습니다. 예를 들어,'records.count()'가'query1.count() + query2.count()'보다 큼을 알 수 있습니다. 이것은 분명히 부정확합니다. – Jian

+4

@Jian djangoproject 문제에 대한 버그와 링크로 장고 버전을 명확히 할 수 있습니까? – IMFletcher

16

version 1.11에서 시작, 장고 검색어 세트는이를 내장형 결합 방법.

q = q1.union(q2) #q will contain all unique records of q1 + q2 
q = q1.union(q2, all=True) #q will contain all records of q1 + q2 including duplicates 
q = q1.union(q2,q3) # more than 2 queryset union 

자세한 내용은 내 blog post을 참조하십시오.

관련 문제