diff options
| author | sarahboyce <sarahvboyce95@gmail.com> | 2022-09-27 15:26:02 +0200 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2022-09-30 06:26:19 +0200 |
| commit | 6cc0f22a73970dd7c0d29d4d8d2ff9e1cc862b30 (patch) | |
| tree | ebd837bca2d06a6b109b5ee97648859a5635f00b /tests/get_or_create | |
| parent | 1d77b931f7df96ec4d6fa3835fe35547397cca1a (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.py | 1 | ||||
| -rw-r--r-- | tests/get_or_create/tests.py | 26 |
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): |
