1
0
mirror of https://github.com/django/django.git synced 2025-10-31 09:41:08 +00:00

[5.1.x] Fixed #35554, Refs #35060 -- Corrected deprecated *args parsing in Model.save()/asave().

The transitional logic added to deprecate the usage of *args for
Model.save()/asave() introduced two issues that this branch fixes:
 * Passing extra positional arguments no longer raised TypeError.
 * Passing a positional but empty update_fields would save all fields.

Co-authored-by: Natalia <124304+nessita@users.noreply.github.com>

Backport of 28522c3c8d from main.
This commit is contained in:
Adam Johnson
2024-06-25 17:12:10 +01:00
committed by Natalia
parent 38248588f6
commit 387172918f
3 changed files with 110 additions and 24 deletions

View File

@@ -1,5 +1,6 @@
from django.db.models.signals import post_save, pre_save
from django.test import TestCase
from django.utils.deprecation import RemovedInDjango60Warning
from .models import Account, Employee, Person, Profile, ProxyEmployee
@@ -256,6 +257,29 @@ class UpdateOnlyFieldsTests(TestCase):
pre_save.disconnect(pre_save_receiver)
post_save.disconnect(post_save_receiver)
def test_empty_update_fields_positional_save(self):
s = Person.objects.create(name="Sara", gender="F")
msg = "Passing positional arguments to save() is deprecated"
with (
self.assertWarnsMessage(RemovedInDjango60Warning, msg),
self.assertNumQueries(0),
):
s.save(False, False, None, [])
async def test_empty_update_fields_positional_asave(self):
s = await Person.objects.acreate(name="Sara", gender="F")
# Workaround for a lack of async assertNumQueries.
s.name = "Other"
msg = "Passing positional arguments to asave() is deprecated"
with self.assertWarnsMessage(RemovedInDjango60Warning, msg):
await s.asave(False, False, None, [])
# No save occurred for an empty update_fields.
await s.arefresh_from_db()
self.assertEqual(s.name, "Sara")
def test_num_queries_inheritance(self):
s = Employee.objects.create(name="Sara", gender="F")
s.employee_num = 1