2012-11-02 48 views
3

在我的數據庫中有一張表,其中包含一些用戶信息。該表被稱爲UserBalance和領域包括usercredits_incredits_outremark(等等)Django。 Q()如何工作?

我想總結的credits_in針對特定用戶,但我得到了不同情況下的不同款項。看看這個:

>>> 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_cointains第一種情況下,在第二和第三種情況下我使用的是Q(),但其條款切換。

有人可以解釋第二和第三種情況有什麼區別嗎?

回答

4

你應該使用(Q(remark='credits gained')|Q(remark='credits given')),不(Q(remark='credits gained') or Q(remark='credits given'))

這是2個完全不同的運營商: |是按位OR,但它重寫爲Q():

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

or是合乎邏輯的(或者說 '合併')運算符。這意味着Q(remark='credits gained') or Q(remark='credits given')將返回第一個非 - 無對象,這就是爲什麼在你的第二種情況下,將導致Q(remark='credits gained'),並在第三個 - 在Q(remark='credits given')