[Django] #36093: Calling `full_clean()` on an existing child model instance in a multi-table inheritance should not execute a database query.

8 views
Skip to first unread message

Django

unread,
Jan 13, 2025, 10:54:49 AM1/13/25
to django-...@googlegroups.com
#36093: Calling `full_clean()` on an existing child model instance in a multi-table
inheritance should not execute a database query.
-------------------------------------+-------------------------------------
Reporter: Sage Abdullah | Type: Bug
Status: new | Component: Database
| layer (models, ORM)
Version: dev | Severity: Release
| blocker
Keywords: | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Regression in bf7b17d16d3978b2e1cee4a0f7ce8840bd1a8dc4.

The following test now fails after the above commit:

{{{
diff --git a/tests/model_inheritance/tests.py
b/tests/model_inheritance/tests.py
index 6b005fcef0..28d03e1687 100644
--- a/tests/model_inheritance/tests.py
+++ b/tests/model_inheritance/tests.py
@@ -343,6 +343,12 @@ class ModelInheritanceTests(TestCase):

self.assertEqual(type(MethodOverride.foo), DeferredAttribute)

+ def test_full_clean(self):
+ restaurant = Restaurant.objects.create()
+ with self.assertNumQueries(0):
+ with self.assertRaises(ValidationError):
+ restaurant.full_clean()
+

class ModelInheritanceDataTests(TestCase):
@classmethod
}}}

This is because the primary key of a child model is a `OneToOneField` to
the parent model (e.g. `place_ptr`), and it's not in `pk_fields`, so the
changes to
[https://github.com/django/django/blob/bf7b17d16d3978b2e1cee4a0f7ce8840bd1a8dc4/django/db/models/base.py#L1496-L1498
the check for the check for skipping primary key when editing] no longer
passes for child models.
--
Ticket URL: <https://code.djangoproject.com/ticket/36093>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

Django

unread,
Jan 13, 2025, 11:04:45 AM1/13/25
to django-...@googlegroups.com
#36093: Calling `full_clean()` on an existing child model instance in a multi-table
inheritance should not execute a database query.
-------------------------------------+-------------------------------------
Reporter: Sage Abdullah | Owner: (none)
Type: Bug | Status: new
Component: Database layer | Version: dev
(models, ORM) |
Severity: Release blocker | Resolution:
Keywords: | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Comment (by Sage Abdullah):

I have a sneaking suspicion that the problem may also manifest in the
other areas affected by the commit, e.g. `bulk_update`. I have yet to
confirm it, though.

If handling this requires some additional logic to check whether a field
is a primary key beyond checking its existence in `_meta.pk_fields`, we
might need to have a dedicated method for it and use it everywhere.
--
Ticket URL: <https://code.djangoproject.com/ticket/36093#comment:1>
Reply all
Reply to author
Forward
0 new messages