姜戈。 Q() 如何真正起作用?

Posted

技术标签:

【中文标题】姜戈。 Q() 如何真正起作用?【英文标题】:Django. How Q() really works? 【发布时间】:2012-10-23 09:56:02 【问题描述】:

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

我正在尝试对某个用户的 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】:

你应该使用(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)

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

【讨论】:

以上是关于姜戈。 Q() 如何真正起作用?的主要内容,如果未能解决你的问题,请参考以下文章

姜戈。如何在查询结果中添加字段?

isAuthenticated() 如何真正起作用?

HAVING 子句如何真正起作用?

绑定到集合是如何真正起作用的?

端口号如何在 TCP 中真正起作用?

Sklearn 潜在狄利克雷分配如何真正起作用?