summaryrefslogtreecommitdiff
path: root/tests/generic_relations
diff options
context:
space:
mode:
authortschilling <schillingt@better-simple.com>2023-01-30 20:39:15 -0600
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2023-02-14 11:50:35 +0100
commitc5808470aaffda661cb911b06d5b848dd7b75467 (patch)
treefd4e8b25bf9a7fee05cd61f27c6536a57f134a16 /tests/generic_relations
parentecafcaf634fcef93f9da8cb12795273dd1c3a576 (diff)
Fixed #34280 -- Allowed specifying different field values for create operation in QuerySet.update_or_create().
Diffstat (limited to 'tests/generic_relations')
-rw-r--r--tests/generic_relations/tests.py60
1 files changed, 60 insertions, 0 deletions
diff --git a/tests/generic_relations/tests.py b/tests/generic_relations/tests.py
index 18e3578f60..fab23dfde5 100644
--- a/tests/generic_relations/tests.py
+++ b/tests/generic_relations/tests.py
@@ -59,6 +59,19 @@ class GenericRelationsTests(TestCase):
self.assertTrue(created)
self.assertEqual(count + 1, self.bacon.tags.count())
+ def test_generic_update_or_create_when_created_with_create_defaults(self):
+ count = self.bacon.tags.count()
+ tag, created = self.bacon.tags.update_or_create(
+ # Since, the "stinky" tag doesn't exist create
+ # a "juicy" tag.
+ create_defaults={"tag": "juicy"},
+ defaults={"tag": "uncured"},
+ tag="stinky",
+ )
+ self.assertEqual(tag.tag, "juicy")
+ self.assertIs(created, True)
+ self.assertEqual(count + 1, self.bacon.tags.count())
+
def test_generic_update_or_create_when_updated(self):
"""
Should be able to use update_or_create from the generic related manager
@@ -74,6 +87,17 @@ class GenericRelationsTests(TestCase):
self.assertEqual(count + 1, self.bacon.tags.count())
self.assertEqual(tag.tag, "juicy")
+ def test_generic_update_or_create_when_updated_with_defaults(self):
+ count = self.bacon.tags.count()
+ tag = self.bacon.tags.create(tag="stinky")
+ self.assertEqual(count + 1, self.bacon.tags.count())
+ tag, created = self.bacon.tags.update_or_create(
+ create_defaults={"tag": "uncured"}, defaults={"tag": "juicy"}, id=tag.id
+ )
+ self.assertIs(created, False)
+ self.assertEqual(count + 1, self.bacon.tags.count())
+ self.assertEqual(tag.tag, "juicy")
+
async def test_generic_async_aupdate_or_create(self):
tag, created = await self.bacon.tags.aupdate_or_create(
id=self.fatty.id, defaults={"tag": "orange"}
@@ -86,6 +110,22 @@ class GenericRelationsTests(TestCase):
self.assertEqual(await self.bacon.tags.acount(), 3)
self.assertEqual(tag.tag, "pink")
+ async def test_generic_async_aupdate_or_create_with_create_defaults(self):
+ tag, created = await self.bacon.tags.aupdate_or_create(
+ id=self.fatty.id,
+ create_defaults={"tag": "pink"},
+ defaults={"tag": "orange"},
+ )
+ self.assertIs(created, False)
+ self.assertEqual(tag.tag, "orange")
+ self.assertEqual(await self.bacon.tags.acount(), 2)
+ tag, created = await self.bacon.tags.aupdate_or_create(
+ tag="pink", create_defaults={"tag": "brown"}
+ )
+ self.assertIs(created, True)
+ self.assertEqual(await self.bacon.tags.acount(), 3)
+ self.assertEqual(tag.tag, "brown")
+
def test_generic_get_or_create_when_created(self):
"""
Should be able to use get_or_create from the generic related manager
@@ -550,6 +590,26 @@ class GenericRelationsTests(TestCase):
self.assertFalse(created)
self.assertEqual(tag.content_object.id, diamond.id)
+ def test_update_or_create_defaults_with_create_defaults(self):
+ # update_or_create() should work with virtual fields (content_object).
+ quartz = Mineral.objects.create(name="Quartz", hardness=7)
+ diamond = Mineral.objects.create(name="Diamond", hardness=7)
+ tag, created = TaggedItem.objects.update_or_create(
+ tag="shiny",
+ create_defaults={"content_object": quartz},
+ defaults={"content_object": diamond},
+ )
+ self.assertIs(created, True)
+ self.assertEqual(tag.content_object.id, quartz.id)
+
+ tag, created = TaggedItem.objects.update_or_create(
+ tag="shiny",
+ create_defaults={"content_object": quartz},
+ defaults={"content_object": diamond},
+ )
+ self.assertIs(created, False)
+ self.assertEqual(tag.content_object.id, diamond.id)
+
def test_query_content_type(self):
msg = "Field 'content_object' does not generate an automatic reverse relation"
with self.assertRaisesMessage(FieldError, msg):