summaryrefslogtreecommitdiff
path: root/tests/postgres_tests/test_bulk_update.py
diff options
context:
space:
mode:
authorTom Forbes <tom@tomforb.es>2018-09-18 21:14:44 +0100
committerTim Graham <timograham@gmail.com>2018-09-18 16:14:44 -0400
commit9cbdb44014c8027f1b4571bac701a247b0ce02a3 (patch)
treeb7cd20864b0d06f5e08b2c98a50cd5ef2a4cd9a0 /tests/postgres_tests/test_bulk_update.py
parent7b159df94235036a41ee93952ff83bbc95c1da3c (diff)
Fixed #23646 -- Added QuerySet.bulk_update() to efficiently update many models.
Diffstat (limited to 'tests/postgres_tests/test_bulk_update.py')
-rw-r--r--tests/postgres_tests/test_bulk_update.py34
1 files changed, 34 insertions, 0 deletions
diff --git a/tests/postgres_tests/test_bulk_update.py b/tests/postgres_tests/test_bulk_update.py
new file mode 100644
index 0000000000..6dd7036a9b
--- /dev/null
+++ b/tests/postgres_tests/test_bulk_update.py
@@ -0,0 +1,34 @@
+from datetime import date
+
+from . import PostgreSQLTestCase
+from .models import (
+ HStoreModel, IntegerArrayModel, JSONModel, NestedIntegerArrayModel,
+ NullableIntegerArrayModel, OtherTypesArrayModel, RangesModel,
+)
+
+try:
+ from psycopg2.extras import NumericRange, DateRange
+except ImportError:
+ pass # psycopg2 isn't installed.
+
+
+class BulkSaveTests(PostgreSQLTestCase):
+ def test_bulk_update(self):
+ test_data = [
+ (IntegerArrayModel, 'field', [], [1, 2, 3]),
+ (NullableIntegerArrayModel, 'field', [1, 2, 3], None),
+ (JSONModel, 'field', {'a': 'b'}, {'c': 'd'}),
+ (NestedIntegerArrayModel, 'field', [], [[1, 2, 3]]),
+ (HStoreModel, 'field', {}, {1: 2}),
+ (RangesModel, 'ints', None, NumericRange(lower=1, upper=10)),
+ (RangesModel, 'dates', None, DateRange(lower=date.today(), upper=date.today())),
+ (OtherTypesArrayModel, 'ips', [], ['1.2.3.4']),
+ (OtherTypesArrayModel, 'json', [], [{'a': 'b'}])
+ ]
+ for Model, field, initial, new in test_data:
+ with self.subTest(model=Model, field=field):
+ instances = Model.objects.bulk_create(Model(**{field: initial}) for _ in range(20))
+ for instance in instances:
+ setattr(instance, field, new)
+ Model.objects.bulk_update(instances, [field])
+ self.assertSequenceEqual(Model.objects.filter(**{field: new}), instances)