summaryrefslogtreecommitdiff
path: root/tests/queries
diff options
context:
space:
mode:
authorHannes Ljungberg <hannes.ljungberg@gmail.com>2021-11-27 16:04:39 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2021-11-29 06:27:22 +0100
commited2018037d152eef7e68f339b4562f8aadc2b7a0 (patch)
tree8fe1a910d8221fa244edbcc4ae921fb239eab8a2 /tests/queries
parent9ac92b1efc5ff90e7cce5c47fbd05887d403e4cd (diff)
downloaddjango-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.py32
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)