@@ -1324,10 +1324,9 @@ class TestModel(Model):
1324
1324
class ExpressionsNumericTests (TestCase ):
1325
1325
@classmethod
1326
1326
def setUpTestData (cls ):
1327
- Number (integer = - 1 ).save ()
1328
- Number (integer = 42 ).save ()
1329
- Number (integer = 1337 ).save ()
1330
- Number .objects .update (float = F ("integer" ))
1327
+ Number (integer = - 1 , float = - 1 ).save ()
1328
+ Number (integer = 42 , float = 42 ).save ()
1329
+ Number (integer = 1337 , float = 1337 ).save ()
1331
1330
1332
1331
def test_fill_with_value_from_same_object (self ):
1333
1332
"""
@@ -1360,9 +1359,8 @@ def test_filter_not_equals_other_field(self):
1360
1359
We can filter for objects, where a value is not equals the value
1361
1360
of an other field.
1362
1361
"""
1363
- self .assertEqual (
1364
- Number .objects .filter (integer__gt = 0 ).update (integer = F ("integer" ) + 1 ), 2
1365
- )
1362
+ Number .objects .filter (integer = 42 ).update (integer = 43 )
1363
+ Number .objects .filter (integer = 1337 ).update (integer = 1338 )
1366
1364
self .assertQuerySetEqual (
1367
1365
Number .objects .exclude (float = F ("integer" )),
1368
1366
[(43 , 42 ), (1338 , 1337 )],
@@ -1382,15 +1380,12 @@ def test_complex_expressions(self):
1382
1380
Complex expressions of different connection types are possible.
1383
1381
"""
1384
1382
n = Number .objects .create (integer = 10 , float = 123.45 )
1385
- self .assertEqual (
1386
- Number .objects .filter (pk = n .pk ).update (float = F ("integer" ) + F ("float" ) * 2 ),
1387
- 1 ,
1383
+ qs = Number .objects .filter (pk = n .pk ).annotate (
1384
+ float1 = F ("integer" ) + F ("float" ) * 2
1388
1385
)
1389
1386
1390
- self .assertEqual (Number .objects .get (pk = n .pk ).integer , 10 )
1391
- self .assertEqual (
1392
- Number .objects .get (pk = n .pk ).float , Approximate (256.900 , places = 3 )
1393
- )
1387
+ self .assertEqual (qs .get (pk = n .pk ).integer , 10 )
1388
+ self .assertEqual (qs .get (pk = n .pk ).float1 , Approximate (256.900 , places = 3 ))
1394
1389
1395
1390
def test_decimal_expression (self ):
1396
1391
n = Number .objects .create (integer = 1 , decimal_value = Decimal ("0.5" ))
@@ -1408,52 +1403,44 @@ def setUpTestData(cls):
1408
1403
1409
1404
def test_lefthand_addition (self ):
1410
1405
# LH Addition of floats and integers
1411
- Number .objects .filter (pk = self .n .pk ).update (
1412
- integer = F ("integer" ) + 15 , float = F ("float" ) + 42.7
1406
+ qs = Number .objects .filter (pk = self .n .pk ).annotate (
1407
+ integer1 = F ("integer" ) + 15 , float1 = F ("float" ) + 42.7
1413
1408
)
1414
1409
1415
- self .assertEqual (Number .objects .get (pk = self .n .pk ).integer , 57 )
1416
- self .assertEqual (
1417
- Number .objects .get (pk = self .n .pk ).float , Approximate (58.200 , places = 3 )
1418
- )
1410
+ self .assertEqual (qs .get (pk = self .n .pk ).integer1 , 57 )
1411
+ self .assertEqual (qs .get (pk = self .n .pk ).float1 , Approximate (58.200 , places = 3 ))
1419
1412
1420
1413
def test_lefthand_subtraction (self ):
1421
1414
# LH Subtraction of floats and integers
1422
- Number .objects .filter (pk = self .n .pk ).update (
1423
- integer = F ("integer" ) - 15 , float = F ("float" ) - 42.7
1415
+ qs = Number .objects .filter (pk = self .n .pk ).annotate (
1416
+ integer1 = F ("integer" ) - 15 , float1 = F ("float" ) - 42.7
1424
1417
)
1425
1418
1426
- self .assertEqual (Number .objects .get (pk = self .n .pk ).integer , 27 )
1427
- self .assertEqual (
1428
- Number .objects .get (pk = self .n .pk ).float , Approximate (- 27.200 , places = 3 )
1429
- )
1419
+ self .assertEqual (qs .get (pk = self .n .pk ).integer1 , 27 )
1420
+ self .assertEqual (qs .get (pk = self .n .pk ).float1 , Approximate (- 27.200 , places = 3 ))
1430
1421
1431
1422
def test_lefthand_multiplication (self ):
1432
1423
# Multiplication of floats and integers
1433
- Number .objects .filter (pk = self .n .pk ).update (
1434
- integer = F ("integer" ) * 15 , float = F ("float" ) * 42.7
1424
+ qs = Number .objects .filter (pk = self .n .pk ).annotate (
1425
+ integer1 = F ("integer" ) * 15 , float1 = F ("float" ) * 42.7
1435
1426
)
1436
1427
1437
- self .assertEqual (Number .objects .get (pk = self .n .pk ).integer , 630 )
1438
- self .assertEqual (
1439
- Number .objects .get (pk = self .n .pk ).float , Approximate (661.850 , places = 3 )
1440
- )
1428
+ self .assertEqual (qs .get (pk = self .n .pk ).integer1 , 630 )
1429
+ self .assertEqual (qs .get (pk = self .n .pk ).float1 , Approximate (661.850 , places = 3 ))
1441
1430
1442
1431
def test_lefthand_division (self ):
1443
1432
# LH Division of floats and integers
1444
- Number .objects .filter (pk = self .n .pk ).update (
1445
- integer = F ("integer" ) / 2 , float = F ("float" ) / 42.7
1433
+ qs = Number .objects .filter (pk = self .n .pk ).annotate (
1434
+ integer1 = F ("integer" ) / 2 , float1 = F ("float" ) / 42.7
1446
1435
)
1447
1436
1448
- self .assertEqual (Number .objects .get (pk = self .n .pk ).integer , 21 )
1449
- self .assertEqual (
1450
- Number .objects .get (pk = self .n .pk ).float , Approximate (0.363 , places = 3 )
1451
- )
1437
+ self .assertEqual (qs .get (pk = self .n .pk ).integer1 , 21 )
1438
+ self .assertEqual (qs .get (pk = self .n .pk ).float1 , Approximate (0.363 , places = 3 ))
1452
1439
1453
1440
def test_lefthand_modulo (self ):
1454
1441
# LH Modulo arithmetic on integers
1455
- Number .objects .filter (pk = self .n .pk ).update ( integer = F ("integer" ) % 20 )
1456
- self .assertEqual (Number . objects . get (pk = self .n .pk ).integer , 2 )
1442
+ qs = Number .objects .filter (pk = self .n .pk ).annotate ( integer1 = F ("integer" ) % 20 )
1443
+ self .assertEqual (qs . get (pk = self .n .pk ).integer1 , 2 )
1457
1444
1458
1445
def test_lefthand_modulo_null (self ):
1459
1446
# LH Modulo arithmetic on integers.
@@ -1463,28 +1450,32 @@ def test_lefthand_modulo_null(self):
1463
1450
1464
1451
def test_lefthand_bitwise_and (self ):
1465
1452
# LH Bitwise ands on integers
1466
- Number .objects .filter (pk = self .n .pk ).update (integer = F ("integer" ).bitand (56 ))
1467
- Number .objects .filter (pk = self .n1 .pk ).update (integer = F ("integer" ).bitand (- 56 ))
1453
+ qs1 = Number .objects .filter (pk = self .n .pk ).annotate (
1454
+ integer1 = F ("integer" ).bitand (56 )
1455
+ )
1456
+ qs2 = Number .objects .filter (pk = self .n1 .pk ).annotate (
1457
+ integer1 = F ("integer" ).bitand (- 56 )
1458
+ )
1468
1459
1469
- self .assertEqual (Number . objects . get (pk = self .n .pk ).integer , 40 )
1470
- self .assertEqual (Number . objects . get (pk = self .n1 .pk ).integer , - 64 )
1460
+ self .assertEqual (qs1 . get (pk = self .n .pk ).integer1 , 40 )
1461
+ self .assertEqual (qs2 . get (pk = self .n1 .pk ).integer1 , - 64 )
1471
1462
1472
1463
def test_lefthand_bitwise_left_shift_operator (self ):
1473
- Number .objects .update ( integer = F ("integer" ).bitleftshift (2 ))
1474
- self .assertEqual (Number . objects . get (pk = self .n .pk ).integer , 168 )
1475
- self .assertEqual (Number . objects . get (pk = self .n1 .pk ).integer , - 168 )
1464
+ qs = Number .objects .annotate ( integer1 = F ("integer" ).bitleftshift (2 ))
1465
+ self .assertEqual (qs . get (pk = self .n .pk ).integer1 , 168 )
1466
+ self .assertEqual (qs . get (pk = self .n1 .pk ).integer1 , - 168 )
1476
1467
1477
1468
def test_lefthand_bitwise_right_shift_operator (self ):
1478
- Number .objects .update ( integer = F ("integer" ).bitrightshift (2 ))
1479
- self .assertEqual (Number . objects . get (pk = self .n .pk ).integer , 10 )
1480
- self .assertEqual (Number . objects . get (pk = self .n1 .pk ).integer , - 11 )
1469
+ qs = Number .objects .annotate ( integer1 = F ("integer" ).bitrightshift (2 ))
1470
+ self .assertEqual (qs . get (pk = self .n .pk ).integer1 , 10 )
1471
+ self .assertEqual (qs . get (pk = self .n1 .pk ).integer1 , - 11 )
1481
1472
1482
1473
def test_lefthand_bitwise_or (self ):
1483
1474
# LH Bitwise or on integers
1484
- Number .objects .update ( integer = F ("integer" ).bitor (48 ))
1475
+ qs = Number .objects .annotate ( integer1 = F ("integer" ).bitor (48 ))
1485
1476
1486
- self .assertEqual (Number . objects . get (pk = self .n .pk ).integer , 58 )
1487
- self .assertEqual (Number . objects . get (pk = self .n1 .pk ).integer , - 10 )
1477
+ self .assertEqual (qs . get (pk = self .n .pk ).integer1 , 58 )
1478
+ self .assertEqual (qs . get (pk = self .n1 .pk ).integer1 , - 10 )
1488
1479
1489
1480
def test_lefthand_transformed_field_bitwise_or (self ):
1490
1481
Employee .objects .create (firstname = "Max" , lastname = "Mustermann" )
@@ -1494,30 +1485,30 @@ def test_lefthand_transformed_field_bitwise_or(self):
1494
1485
1495
1486
def test_lefthand_power (self ):
1496
1487
# LH Power arithmetic operation on floats and integers
1497
- Number .objects .filter (pk = self .n .pk ).update (
1498
- integer = F ("integer" ) ** 2 , float = F ("float" ) ** 1.5
1499
- )
1500
- self .assertEqual (Number .objects .get (pk = self .n .pk ).integer , 1764 )
1501
- self .assertEqual (
1502
- Number .objects .get (pk = self .n .pk ).float , Approximate (61.02 , places = 2 )
1488
+ qs = Number .objects .filter (pk = self .n .pk ).annotate (
1489
+ integer1 = F ("integer" ) ** 2 , float1 = F ("float" ) ** 1.5
1503
1490
)
1491
+ self .assertEqual (qs .get (pk = self .n .pk ).integer1 , 1764 )
1492
+ self .assertEqual (qs .get (pk = self .n .pk ).float1 , Approximate (61.02 , places = 2 ))
1504
1493
1505
1494
def test_lefthand_bitwise_xor (self ):
1506
- Number .objects .update ( integer = F ("integer" ).bitxor (48 ))
1507
- self .assertEqual (Number . objects . get (pk = self .n .pk ).integer , 26 )
1508
- self .assertEqual (Number . objects . get (pk = self .n1 .pk ).integer , - 26 )
1495
+ qs = Number .objects .annotate ( integer1 = F ("integer" ).bitxor (48 ))
1496
+ self .assertEqual (qs . get (pk = self .n .pk ).integer1 , 26 )
1497
+ self .assertEqual (qs . get (pk = self .n1 .pk ).integer1 , - 26 )
1509
1498
1510
1499
def test_lefthand_bitwise_xor_null (self ):
1511
1500
employee = Employee .objects .create (firstname = "John" , lastname = "Doe" )
1512
- Employee .objects .update (salary = F ("salary" ).bitxor (48 ))
1513
- employee .refresh_from_db ()
1514
- self .assertIsNone (employee .salary )
1501
+ qs = Employee .objects .annotate (salary1 = F ("salary" ).bitxor (48 ))
1502
+ self .assertIsNone (qs .get (id = employee .id ).salary1 )
1515
1503
1516
1504
def test_lefthand_bitwise_xor_right_null (self ):
1517
1505
employee = Employee .objects .create (firstname = "John" , lastname = "Doe" , salary = 48 )
1518
- Employee .objects .update (salary = F ("salary" ).bitxor (None ))
1519
- employee .refresh_from_db ()
1520
- self .assertIsNone (employee .salary )
1506
+ qs = Employee .objects .annotate (
1507
+ salary1 = ExpressionWrapper (
1508
+ F ("salary" ).bitxor (None ), output_field = IntegerField ()
1509
+ )
1510
+ )
1511
+ self .assertIsNone (qs .get (id = employee .id ).salary1 )
1521
1512
1522
1513
@unittest .skipUnless (
1523
1514
connection .vendor == "oracle" , "Oracle doesn't support bitwise XOR."
@@ -1529,64 +1520,54 @@ def test_lefthand_bitwise_xor_not_supported(self):
1529
1520
1530
1521
def test_right_hand_addition (self ):
1531
1522
# Right hand operators
1532
- Number .objects .filter (pk = self .n .pk ).update (
1533
- integer = 15 + F ("integer" ), float = 42.7 + F ("float" )
1523
+ qs = Number .objects .filter (pk = self .n .pk ).annotate (
1524
+ integer1 = 15 + F ("integer" ), float1 = 42.7 + F ("float" )
1534
1525
)
1535
1526
1536
1527
# RH Addition of floats and integers
1537
- self .assertEqual (Number .objects .get (pk = self .n .pk ).integer , 57 )
1538
- self .assertEqual (
1539
- Number .objects .get (pk = self .n .pk ).float , Approximate (58.200 , places = 3 )
1540
- )
1528
+ self .assertEqual (qs .get (pk = self .n .pk ).integer1 , 57 )
1529
+ self .assertEqual (qs .get (pk = self .n .pk ).float1 , Approximate (58.200 , places = 3 ))
1541
1530
1542
1531
def test_right_hand_subtraction (self ):
1543
- Number .objects .filter (pk = self .n .pk ).update (
1544
- integer = 15 - F ("integer" ), float = 42.7 - F ("float" )
1532
+ qs = Number .objects .filter (pk = self .n .pk ).annotate (
1533
+ integer1 = 15 - F ("integer" ), float1 = 42.7 - F ("float" )
1545
1534
)
1546
1535
1547
1536
# RH Subtraction of floats and integers
1548
- self .assertEqual (Number .objects .get (pk = self .n .pk ).integer , - 27 )
1549
- self .assertEqual (
1550
- Number .objects .get (pk = self .n .pk ).float , Approximate (27.200 , places = 3 )
1551
- )
1537
+ self .assertEqual (qs .get (pk = self .n .pk ).integer1 , - 27 )
1538
+ self .assertEqual (qs .get (pk = self .n .pk ).float1 , Approximate (27.200 , places = 3 ))
1552
1539
1553
1540
def test_right_hand_multiplication (self ):
1554
1541
# RH Multiplication of floats and integers
1555
- Number .objects .filter (pk = self .n .pk ).update (
1556
- integer = 15 * F ("integer" ), float = 42.7 * F ("float" )
1542
+ qs = Number .objects .filter (pk = self .n .pk ).annotate (
1543
+ integer1 = 15 * F ("integer" ), float1 = 42.7 * F ("float" )
1557
1544
)
1558
1545
1559
- self .assertEqual (Number .objects .get (pk = self .n .pk ).integer , 630 )
1560
- self .assertEqual (
1561
- Number .objects .get (pk = self .n .pk ).float , Approximate (661.850 , places = 3 )
1562
- )
1546
+ self .assertEqual (qs .get (pk = self .n .pk ).integer1 , 630 )
1547
+ self .assertEqual (qs .get (pk = self .n .pk ).float1 , Approximate (661.850 , places = 3 ))
1563
1548
1564
1549
def test_right_hand_division (self ):
1565
1550
# RH Division of floats and integers
1566
- Number .objects .filter (pk = self .n .pk ).update (
1567
- integer = 640 / F ("integer" ), float = 42.7 / F ("float" )
1551
+ qs = Number .objects .filter (pk = self .n .pk ).annotate (
1552
+ integer1 = 640 / F ("integer" ), float1 = 42.7 / F ("float" )
1568
1553
)
1569
1554
1570
- self .assertEqual (Number .objects .get (pk = self .n .pk ).integer , 15 )
1571
- self .assertEqual (
1572
- Number .objects .get (pk = self .n .pk ).float , Approximate (2.755 , places = 3 )
1573
- )
1555
+ self .assertEqual (qs .get (pk = self .n .pk ).integer1 , 15 )
1556
+ self .assertEqual (qs .get (pk = self .n .pk ).float1 , Approximate (2.755 , places = 3 ))
1574
1557
1575
1558
def test_right_hand_modulo (self ):
1576
1559
# RH Modulo arithmetic on integers
1577
- Number .objects .filter (pk = self .n .pk ).update ( integer = 69 % F ("integer" ))
1560
+ qs = Number .objects .filter (pk = self .n .pk ).annotate ( integer1 = 69 % F ("integer" ))
1578
1561
1579
- self .assertEqual (Number . objects . get (pk = self .n .pk ).integer , 27 )
1562
+ self .assertEqual (qs . get (pk = self .n .pk ).integer1 , 27 )
1580
1563
1581
1564
def test_righthand_power (self ):
1582
1565
# RH Power arithmetic operation on floats and integers
1583
- Number .objects .filter (pk = self .n .pk ).update (
1584
- integer = 2 ** F ("integer" ), float = 1.5 ** F ("float" )
1585
- )
1586
- self .assertEqual (Number .objects .get (pk = self .n .pk ).integer , 4398046511104 )
1587
- self .assertEqual (
1588
- Number .objects .get (pk = self .n .pk ).float , Approximate (536.308 , places = 3 )
1566
+ qs = Number .objects .filter (pk = self .n .pk ).annotate (
1567
+ integer1 = 2 ** F ("integer" ), float1 = 1.5 ** F ("float" )
1589
1568
)
1569
+ self .assertEqual (qs .get (pk = self .n .pk ).integer1 , 4398046511104 )
1570
+ self .assertEqual (qs .get (pk = self .n .pk ).float1 , Approximate (536.308 , places = 3 ))
1590
1571
1591
1572
1592
1573
class FTimeDeltaTests (TestCase ):
0 commit comments