diff options
author | Hannes Ljungberg <hannes.ljungberg@gmail.com> | 2021-11-27 16:04:39 +0100 |
---|---|---|
committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2021-11-29 06:27:22 +0100 |
commit | ed2018037d152eef7e68f339b4562f8aadc2b7a0 (patch) | |
tree | 8fe1a910d8221fa244edbcc4ae921fb239eab8a2 /tests/queries | |
parent | 9ac92b1efc5ff90e7cce5c47fbd05887d403e4cd (diff) | |
download | django-ed2018037d152eef7e68f339b4562f8aadc2b7a0.tar.gz |
Fixed #33322 -- Fixed loss of assigned related object when saving relation with bulk_update().
Diffstat (limited to 'tests/queries')
-rw-r--r-- | tests/queries/test_bulk_update.py | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/tests/queries/test_bulk_update.py b/tests/queries/test_bulk_update.py index 6ca7f201c1..1d669e0bbd 100644 --- a/tests/queries/test_bulk_update.py +++ b/tests/queries/test_bulk_update.py @@ -7,7 +7,8 @@ from django.test import TestCase, skipUnlessDBFeature from .models import ( Article, CustomDbColumn, CustomPk, Detail, Individual, JSONFieldNullable, - Member, Note, Number, Order, Paragraph, SpecialCategory, Tag, Valid, + Member, Note, Number, Order, Paragraph, RelatedObject, SingleObject, + SpecialCategory, Tag, Valid, ) @@ -250,3 +251,32 @@ class BulkUpdateTests(TestCase): obj.json_field = {'c': obj.json_field['a'] + 1} JSONFieldNullable.objects.bulk_update(objs, ['json_field']) self.assertCountEqual(JSONFieldNullable.objects.filter(json_field__has_key='c'), objs) + + def test_nullable_fk_after_related_save(self): + parent = RelatedObject.objects.create() + child = SingleObject() + parent.single = child + parent.single.save() + RelatedObject.objects.bulk_update([parent], fields=['single']) + self.assertEqual(parent.single_id, parent.single.pk) + parent.refresh_from_db() + self.assertEqual(parent.single, child) + + def test_unsaved_parent(self): + parent = RelatedObject.objects.create() + parent.single = SingleObject() + msg = ( + "bulk_update() prohibited to prevent data loss due to unsaved " + "related object 'single'." + ) + with self.assertRaisesMessage(ValueError, msg): + RelatedObject.objects.bulk_update([parent], fields=['single']) + + def test_unspecified_unsaved_parent(self): + parent = RelatedObject.objects.create() + parent.single = SingleObject() + parent.f = 42 + RelatedObject.objects.bulk_update([parent], fields=['f']) + parent.refresh_from_db() + self.assertEqual(parent.f, 42) + self.assertIsNone(parent.single) |