浏览代码

Fixed #29066 -- Allowed negating query expressions.

priyanshsaxena 7 年之前
父节点
当前提交
617d5f410f
共有 5 个文件被更改,包括 17 次插入3 次删除
  1. 1 0
      AUTHORS
  2. 3 0
      django/db/models/expressions.py
  3. 7 3
      docs/ref/models/expressions.txt
  4. 2 0
      docs/releases/2.1.txt
  5. 4 0
      tests/expressions/tests.py

+ 1 - 0
AUTHORS

@@ -662,6 +662,7 @@ answer newbie questions, and generally made Django that much better:
     pradeep.gowda@gmail.com
     Preston Holmes <preston@ptone.com>
     Preston Timmons <prestontimmons@gmail.com>
+    Priyansh Saxena <askpriyansh@gmail.com>
     Rachel Tobin <rmtobin@me.com>
     Rachel Willmer <http://www.willmer.com/kb/>
     Radek Švarz <http://www.svarz.cz/translate/>

+ 3 - 0
django/db/models/expressions.py

@@ -65,6 +65,9 @@ class Combinable:
     # OPERATORS #
     #############
 
+    def __neg__(self):
+        return self._combine(-1, self.MUL, False)
+
     def __add__(self, other):
         return self._combine(other, self.ADD, False)
 

+ 7 - 3
docs/ref/models/expressions.txt

@@ -13,9 +13,13 @@ more complex computations.
 Supported arithmetic
 ====================
 
-Django supports addition, subtraction, multiplication, division, modulo
-arithmetic, and the power operator on query expressions, using Python constants,
-variables, and even other expressions.
+Django supports negation, addition, subtraction, multiplication, division,
+modulo arithmetic, and the power operator on query expressions, using Python
+constants, variables, and even other expressions.
+
+.. versionchanged:: 2.1
+
+    Support for negation was added.
 
 Some examples
 =============

+ 2 - 0
docs/releases/2.1.txt

@@ -178,6 +178,8 @@ Models
   :class:`~django.db.models.DateField` and
   :class:`~django.db.models.DateTimeField` to the Monday of a week.
 
+* Query expressions can now be negated using a minus sign.
+
 Requests and Responses
 ~~~~~~~~~~~~~~~~~~~~~~
 

+ 4 - 0
tests/expressions/tests.py

@@ -1425,6 +1425,10 @@ class ReprTests(TestCase):
 class CombinableTests(SimpleTestCase):
     bitwise_msg = 'Use .bitand() and .bitor() for bitwise logical operations.'
 
+    def test_negation(self):
+        c = Combinable()
+        self.assertEqual(-c, c * -1)
+
     def test_and(self):
         with self.assertRaisesMessage(NotImplementedError, self.bitwise_msg):
             Combinable() & Combinable()