summaryrefslogtreecommitdiff
path: root/tests/get_or_create
diff options
context:
space:
mode:
authorsarahboyce <sarahvboyce95@gmail.com>2022-09-27 15:26:02 +0200
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2022-09-30 06:26:19 +0200
commit6cc0f22a73970dd7c0d29d4d8d2ff9e1cc862b30 (patch)
treeebd837bca2d06a6b109b5ee97648859a5635f00b /tests/get_or_create
parent1d77b931f7df96ec4d6fa3835fe35547397cca1a (diff)
Fixed #32095 -- Made QuerySet.update_or_create() save only fields passed in defaults or with custom pre_save().
Thanks Florian Apolloner for the initial patch.
Diffstat (limited to 'tests/get_or_create')
-rw-r--r--tests/get_or_create/models.py1
-rw-r--r--tests/get_or_create/tests.py26
2 files changed, 27 insertions, 0 deletions
diff --git a/tests/get_or_create/models.py b/tests/get_or_create/models.py
index f8f6157348..6875671501 100644
--- a/tests/get_or_create/models.py
+++ b/tests/get_or_create/models.py
@@ -63,3 +63,4 @@ class Book(models.Model):
related_name="books",
db_column="publisher_id_column",
)
+ updated = models.DateTimeField(auto_now=True)
diff --git a/tests/get_or_create/tests.py b/tests/get_or_create/tests.py
index aa68d41c00..65d7510682 100644
--- a/tests/get_or_create/tests.py
+++ b/tests/get_or_create/tests.py
@@ -6,6 +6,7 @@ from threading import Thread
from django.core.exceptions import FieldError
from django.db import DatabaseError, IntegrityError, connection
from django.test import TestCase, TransactionTestCase, skipUnlessDBFeature
+from django.test.utils import CaptureQueriesContext
from django.utils.functional import lazy
from .models import (
@@ -513,6 +514,31 @@ class UpdateOrCreateTests(TestCase):
self.assertIs(created, False)
self.assertEqual(journalist.name, "John")
+ def test_update_only_defaults_and_pre_save_fields_when_local_fields(self):
+ publisher = Publisher.objects.create(name="Acme Publishing")
+ book = Book.objects.create(publisher=publisher, name="The Book of Ed & Fred")
+
+ for defaults in [{"publisher": publisher}, {"publisher_id": publisher}]:
+ with self.subTest(defaults=defaults):
+ with CaptureQueriesContext(connection) as captured_queries:
+ book, created = Book.objects.update_or_create(
+ pk=book.pk,
+ defaults=defaults,
+ )
+ self.assertIs(created, False)
+ update_sqls = [
+ q["sql"] for q in captured_queries if q["sql"].startswith("UPDATE")
+ ]
+ self.assertEqual(len(update_sqls), 1)
+ update_sql = update_sqls[0]
+ self.assertIsNotNone(update_sql)
+ self.assertIn(
+ connection.ops.quote_name("publisher_id_column"), update_sql
+ )
+ self.assertIn(connection.ops.quote_name("updated"), update_sql)
+ # Name should not be updated.
+ self.assertNotIn(connection.ops.quote_name("name"), update_sql)
+
class UpdateOrCreateTestsWithManualPKs(TestCase):
def test_create_with_duplicate_primary_key(self):