2014-06-22 2 views
0

나는 다음과 같은 쿼리Q 쿼리

return Table.objects.filter(Q(cond1) | Q(cond2)) 

특정 행을 부여하고있다있는 상태 알 수있는 방법이있는 경우?

+0

더 많은 동기와 유스 케이스를 설명해 주시겠습니까? 감사. – alecxe

+0

원본 테이블의 PK 열을 모두 공유하는 다른 테이블을 쿼리해야합니다. 감사. – nickbusted

+0

BTW, 질문의 현재 제목 ('Q 쿼리 in Django')이 더 구체적이어야합니다. – Ernest0x

답변

1

두 쿼리에 쿼리를 분할 할 수 있습니다 : 그런 다음 검색어 세트의 조합 만들

qs1 = Table.objects.filter(cond1).extra(select={'condition': 'cond1'}) 
qs2 = Table.objects.filter(cond2).extra(select={'condition': 'cond2'}) 

:

qs12 = Qs1으로 일 | qs2

편집 :

from itertools import chain 

qs12 = list(chain(qs1, qs2)) 

그리고 다음과 같이 사용 :

for obj in qs12: 
    if obj.condition == 'cond1': 
     ... 
    elif obj.condition == 'cond2': 
     ... 
1

노동 조합은

이 그런 다음 검색어 세트의 체인을 만들 수) (추가로 검색어 세트 사이에 지원되지 않습니다 별로, 아니. 귀하의 쿼리는 다음 SQL 거의 비슷하다 :

SELECT * 
FROM Table 
WHERE condition OR other_condition 

은 그냥 장고 쿼리처럼, 당신이 특정 관계에 대한 사실로 발생하는 상태를 알려줍니다 자연적인 지표가 없습니다. 두 개의 쿼리를 실행하거나 관계에 추가 정보 (조건)를 추가하거나 조건 자체를 사용해야합니다.

c1 = Q('name__exact'='Bob') # condition 1 
c2 = Q('name__exact'='Mary') # condition 2 

# use separate queries 
set1 = Table.objects.filter(c1) # meets condition 1 
set2 = Table.objects.filter(c2) # meets condition 2 

# or use the natural condition 
both = Table.objects.filter(c1|c2) 
for item in both: 
    if item.name == 'Bob': 
     # condition 1 
    elif item.name == 'Mary': 
     # condition 2 
관련 문제