diff options
| author | Sjoerd Job Postmus <sjoerdjob@sjec.nl> | 2016-08-05 23:57:55 +0200 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2016-08-06 10:25:29 -0400 |
| commit | 2f18cbc3130d1d601ab6c40d26930b8cfbd77a75 (patch) | |
| tree | 53692d3e660e01e1fd20e4845d552eda23d3777b | |
| parent | d68b145a6f6e5e5dc1775cdaa904d83ee28ed615 (diff) | |
[1.10.x] Fixed #27026 -- Fixed state initialization of bulk_create() objects if can_return_ids_from_bulk_insert.
Backport of 3246d2b4bb981a8d782a349a99e9b89206028cee from master
| -rw-r--r-- | django/db/models/query.py | 6 | ||||
| -rw-r--r-- | docs/releases/1.10.1.txt | 5 | ||||
| -rw-r--r-- | tests/bulk_create/tests.py | 10 |
3 files changed, 19 insertions, 2 deletions
diff --git a/django/db/models/query.py b/django/db/models/query.py index fe84a9ef34..dd2a6001d0 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -452,8 +452,10 @@ class QuerySet(object): ids = self._batched_insert(objs_without_pk, fields, batch_size) if connection.features.can_return_ids_from_bulk_insert: assert len(ids) == len(objs_without_pk) - for i in range(len(ids)): - objs_without_pk[i].pk = ids[i] + for obj_without_pk, pk in zip(objs_without_pk, ids): + obj_without_pk.pk = pk + obj_without_pk._state.adding = False + obj_without_pk._state.db = self.db return objs diff --git a/docs/releases/1.10.1.txt b/docs/releases/1.10.1.txt index 2950c06042..b805fbe12b 100644 --- a/docs/releases/1.10.1.txt +++ b/docs/releases/1.10.1.txt @@ -37,3 +37,8 @@ Bugfixes * Fixed a regression in ``Client.force_login()`` which required specifying a ``backend`` rather than automatically using the first one if multiple backends are configured (:ticket:`27027`). + +* Made ``QuerySet.bulk_create()`` properly initialize model instances on + backends, such as PostgreSQL, that support returning the IDs of the created + records so that many-to-many relationships can be used on the new objects + (:ticket:`27026`). diff --git a/tests/bulk_create/tests.py b/tests/bulk_create/tests.py index a7eb725f55..e6d85cb815 100644 --- a/tests/bulk_create/tests.py +++ b/tests/bulk_create/tests.py @@ -217,3 +217,13 @@ class BulkCreateTests(TestCase): self.assertEqual(Country.objects.get(pk=countries[1].pk), countries[1]) self.assertEqual(Country.objects.get(pk=countries[2].pk), countries[2]) self.assertEqual(Country.objects.get(pk=countries[3].pk), countries[3]) + + @skipUnlessDBFeature('can_return_ids_from_bulk_insert') + def test_set_state(self): + country_nl = Country(name='Netherlands', iso_two_letter='NL') + country_be = Country(name='Belgium', iso_two_letter='BE') + Country.objects.bulk_create([country_nl]) + country_be.save() + # Objects save via bulk_create() and save() should have equal state. + self.assertEqual(country_nl._state.adding, country_be._state.adding) + self.assertEqual(country_nl._state.db, country_be._state.db) |
