2012-11-02 3 views
3

내 데이터베이스에 일부 사용자 정보가 들어있는 테이블이 있습니다. 표는 UserBalance라고하며 필드는 내가 특정 사용자에 대한 credits_in 합계를 시도하고 있지만 서로 다른 경우에 대해 서로 다른 금액을 얻을 user, credits_incredits_outremark (다른 사람의 사이에서)Django. 어떻게 Q()가 실제로 작동합니까?

을 포함한다. 이것 봐 :

>>> cg = UserBalance.objects.filter(user=ranked_user).filter(remark__icontains='credits g').aggregate(sum_in=Sum('credits_in')) 
>>> cg 
{'sum_in': 35.85} 
>>> cg = UserBalance.objects.filter(user=ranked_user).filter(Q(remark='credits gained') or Q(remark='credits given')).aggregate(sum_in=Sum('credits_in')) 
>>> cg 
{'sum_in': 26.16} 
>>> cg = UserBalance.objects.filter(user=ranked_user).filter(Q(remark='credits given') or Q(remark='credits gained')).aggregate(sum_in=Sum('credits_in')) 
>>> cg 
{'sum_in': 9.69} 

를 I가 사용 i_cointains 제 경우, 두 번째 및 세 번째 경우에 해당 I 용어 스위치드 Q()로하지만를 사용한다.

누군가 2 번째와 3 번째의 차이점을 설명 할 수 있습니까?

답변

4

당신은 (Q(remark='credits gained')|Q(remark='credits given'))를 사용해서는 안 (Q(remark='credits gained') or Q(remark='credits given'))

그것은이 개 완전히 다른 사업자의 : | 비트는 OR 있지만 Q()에 대한 재정의 같습니다 or 논리 연산자 ('합체'또는 오히려)이다

def __or__(self, other): 
    return self._combine(other, self.OR) 

있다. Q(remark='credits gained') or Q(remark='credits given')이 첫 번째 비 - 없음 객체를 반환한다는 것을 의미합니다. 따라서 두 번째 경우는 Q(remark='credits gained')이고 세 번째 경우는 Q(remark='credits given')

입니다.
관련 문제