3

在我的数据库中有一个包含一些用户信息的表。该表被调用UserBalance,字段包括user,credits_in和(credits_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() 但它的术语已切换。

有人能解释一下第 2 种情况和第 3 种情况有什么区别吗?

4

1 回答 1

4

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

这是 2 个完全不同的运算符:| 是按位或,但它被 Q() 覆盖:

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

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

于 2012-11-02T17:59:41.047 回答