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し、2番目と3番目のケースでは、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つの完全に異なる演算子です:| ビット単位のORですが、Q()ではオーバーライドされます。

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

whileorは論理(または「合体」)演算子です。Q(remark='credits gained') or Q(remark='credits given')これは、最初のnot-Noneオブジェクトを返すことを意味します。そのため、2番目のケースでは、結果にQ(remark='credits gained')なり、3番目のケースでは-になります。Q(remark='credits given')

于 2012-11-02T17:59:41.047 に答える