test_bulk_update.py 1.4 KB

123456789101112131415161718192021222324252627282930313233
  1. from datetime import date
  2. from . import PostgreSQLTestCase
  3. from .models import (
  4. HStoreModel, IntegerArrayModel, NestedIntegerArrayModel,
  5. NullableIntegerArrayModel, OtherTypesArrayModel, RangesModel,
  6. )
  7. try:
  8. from psycopg2.extras import NumericRange, DateRange
  9. except ImportError:
  10. pass # psycopg2 isn't installed.
  11. class BulkSaveTests(PostgreSQLTestCase):
  12. def test_bulk_update(self):
  13. test_data = [
  14. (IntegerArrayModel, 'field', [], [1, 2, 3]),
  15. (NullableIntegerArrayModel, 'field', [1, 2, 3], None),
  16. (NestedIntegerArrayModel, 'field', [], [[1, 2, 3]]),
  17. (HStoreModel, 'field', {}, {1: 2}),
  18. (RangesModel, 'ints', None, NumericRange(lower=1, upper=10)),
  19. (RangesModel, 'dates', None, DateRange(lower=date.today(), upper=date.today())),
  20. (OtherTypesArrayModel, 'ips', [], ['1.2.3.4']),
  21. (OtherTypesArrayModel, 'json', [], [{'a': 'b'}])
  22. ]
  23. for Model, field, initial, new in test_data:
  24. with self.subTest(model=Model, field=field):
  25. instances = Model.objects.bulk_create(Model(**{field: initial}) for _ in range(20))
  26. for instance in instances:
  27. setattr(instance, field, new)
  28. Model.objects.bulk_update(instances, [field])
  29. self.assertSequenceEqual(Model.objects.filter(**{field: new}), instances)