Django的。 Q()真的如何运作?

时间:2012-11-02 17:34:54

标签: django django-models django-q

在我的数据库中有一个表,其中包含一些用户信息。该表名为UserBalance,字段包括usercredits_incredits_out以及remark(等等)

我想为某个用户求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()但其术语已切换。

有人可以解释第二和第三种情况之间的区别吗?

1 个答案:

答案 0 :(得分:4)

您应该使用(Q(remark='credits gained')|Q(remark='credits given')),而不是(Q(remark='credits gained') or Q(remark='credits given'))

这是两个完全不同的运营商: |是按位OR,但它被Q()覆盖:

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

or是逻辑(或更确切地说是'合并')运算符。这意味着Q(remark='credits gained') or Q(remark='credits given')将首先返回not-None对象,这就是为什么在第二种情况下它将导致Q(remark='credits gained'),而在第三种情况下将导致Q(remark='credits given')